Войти
iPhoneФорумОбщее

Xcode печаль.

#0
13:59, 8 авг 2012

Будьте внимательны при написании программ в Xcode. Вот совершенно правильный с его точки зрения исходный код (компилируется без единого предупреждения):

#include <stdio.h>

class TestClass {
public:
  TestClass()
    { printf("A created\n"); }
  void printContents()
    { printf("Int: %d\nFloat: %f\n", v1, v2); }
  
private:
  int v1;
  float v2;
};

TestClass getRandomClass() { }
int getRandomNumber() { }

int main(int argc, char **argv)
{
  TestClass a = getRandomClass();
  a.printContents();
  printf("%d, %d, %d, %d\n" , getRandomNumber(), getRandomNumber(), getRandomNumber(), getRandomNumber() );
  return 0;
}

В лучшем случае вы получите предупреждение о том, что в конце файла нет новой строки.

Изображение

Лечение


В настройках проекта следует включить предупреждение "Mismatched Return Type", которое по умолчанию выключено.
#1
14:01, 8 авг 2012

Ideone туда же.

#2
14:03, 8 авг 2012

А у парня противоположные проблеммы:
http://stackoverflow.com/questions/2440337/warning-control-reache… nction-iphone

#3
14:43, 8 авг 2012

Ну это как бы завсит от компилятора и его настроек. У XCode много недостатков, но не понятно почему отсутсвие ворнинга от внешнего компилятора - проблема XCode

#4
14:52, 8 авг 2012

Бред это попробовал, выдает предупреждение что нет возврата значения

#5
15:21, 8 авг 2012

crsib
> внешнего компилятора
Apple LLVM - разве это можно назвать внешним компилятором? Формально он, конечно, внешний, но поставляется вместе с Xcode.

TioRio
> Бред это попробовал, выдает предупреждение что нет возврата значения
Возможно, дефолтные настройки разные для iOS и OS X проектов.

#6
15:26, 8 авг 2012

Sergio
> Apple LLVM - разве это можно назвать внешним компилятором? Формально он,
> конечно, внешний, но поставляется вместе с Xcode.
Clang/LLVM делаются open source сообществом и зародился в иллинойском университете. Apple, как, например, и Google - просто спонсоры. Так что да - это внешний компилятор

#7
15:34, 8 авг 2012

увеличь warning level. или включи генерацию подобных варнингов, насколько я помню это последняя секция в меню настройки компилятора. там много чего отключено, просто включи

#8
15:44, 8 авг 2012

Pushkoff
> просто включи
Ну да, я же в первом посте написал как это решить.

#9
15:27, 9 авг 2012

Добавлю тоже. В какой то момент в XCode оставили только компилятор LLVM 3.0. Как выяснилось этому компилятору очень не нравится такой код:

class cVector3du
{
public:
    union
    {
        struct
        {
            float x;
            float y;
            float z;
        };
        float v[3];
    };
};

struct sAxes
{
    cVector3du  m_right;
    float       m_w1;
    cVector3du  m_up;
    float       m_w2;
    cVector3du  m_forward;
    float       m_w3;
};

class cMatrix4x4
{
    union
    {
        struct
        {
            sAxes       axes;
            cVector3du  m_origin;
            float       m_w4;
        };
        struct
        {
            float _11, _12, _13, _14;
            float _21, _22, _23, _24;
            float _31, _32, _33, _34;
            float _41, _42, _43, _44;
        };
        float m[4][4];
        float f[16];
    };
    
    static cMatrix4x4 Identity;
    
    cMatrix4x4(){};
    cMatrix4x4( float m11, float m12, float m13, float m14,
                float m21, float m22, float m23, float m24,
                float m31, float m32, float m33, float m34,
                float m41, float m42, float m43, float m44 ):
                _11(m11), _12(m12), _13(m13), _14(m14),
                _21(m21), _22(m22), _23(m23), _24(m24),
                _31(m31), _32(m32), _33(m33), _34(m34),
                _41(m41), _42(m42), _43(m43), _44(m44) {}
    cMatrix4x4( const cVector3du & origin )
    {
    }
};

cMatrix4x4 cMatrix4x4::Identity( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 );

Компилер крашится на компиляции такого кода. (Счастливым обладателям LLVM > 3.0 версии можно уже не беспокоится)

#10
16:40, 9 авг 2012

>Как выяснилось этому компилятору очень не нравится такой код
Мне тоже.

#11
18:29, 10 авг 2012

Крушите его полностью!

#include <iostream>

template <int aValue>
struct Factorial { static const int Value = aValue * Factorial<aValue-1>::Value; };

template <> struct Factorial<1> { static const int Value = 1; };

int main(int argc, char **argv)
{
  std::cout << "Factorial 900 = " << Factorial<900>::Value << std::endl;
  return 0;
}

Даже при попытке открыть проект с этим файлом.

#12
21:40, 10 авг 2012

LLVM 3.0. - очень не дружит с anonymous structs

iPhoneФорумОбщее

Тема в архиве.