Разница в компиляции в GCC и LLVM GCC Compiler - PullRequest
1 голос
/ 11 октября 2011

Я занимаюсь разработкой приложения для iPhone, которое использует 3 проекта. Один проект разработан с использованием комбинации кода на c и c ++, а другой - на Objective C, а один - связать оба проекта (Objective-C и C и C ++).

Теперь, когда я компилирую свой проект C и C ++ в компиляторе GCC, он компилируется идеально, но когда я компилирую тот же проект с компилятором LLVM-GCC, выдается ошибка «Элемент Initilizer не является константой».

#define MY_WSD const

struct FuncDef {
  i8 nArg;             
  u8 iPrefEnc;         
  u8 needCollSeq;      
  u8 flags;            
  void *pUserData;     
  FuncDef *pNext;      
  char *zName;
  FuncDef *pHash;
};

typedef struct FuncDef FuncDef;

#define FUNCTION(zName, nArg, iArg, bNC, xFunc) \
  {nArg, SQLITE_UTF8, bNC, 0, SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, #zName}

Вот код, ответственный за ошибку:

void myDateTimeFunctions(void){
    static MY_WSD FuncDef aDateTimeFuncs[] = {
    FUNCTION(julianday,        -1, 0, 0, juliandayFunc ), //when I compile the code with LLVM GCC it's giving me error 
                                                          //at this line and the later line and working fine with GCC 
                                                          //alone compiler. But the problem is XCode 4.2 does not come 
                                                          //with GCC alone compiler, so I am unable to run the applciation.
    FUNCTION(date,             -1, 0, 0, dateFunc      ),
  };

Пожалуйста, дайте мне знать, если мне не хватает ценной информации для исправления ошибки.

Ответы [ 3 ]

1 голос
/ 11 октября 2011

Есть ли у вас какие-либо предупреждения перед ошибкой?Можно предположить, что SQLITE_INT_TO_PTR не определен и по умолчанию используется вызов функции.

В противном случае попробуйте llvm-gcc -E в файле (вам может понадобиться заглянуть в журнал сборки Xcode, чтобы получить полную строку)посмотрим, во что это компилируется.

1 голос
/ 11 октября 2011

Я бы предположил, что SQLITE_INT_TO_PTR(iArg) не является константой при использовании компилятора LLVM, и поэтому у вас неправильный код.

Вы видите ту же ошибку, если компилируете с прямым gcc, используя переключатель --std=c99? Если вы это сделаете, попробуйте запустить компиляцию gcc-LLVM с --std=gnu99, чтобы увидеть, исчезнет ли проблема.

0 голосов
/ 12 октября 2011

Эй, спасибо за вашу поддержку и ответ. Я получил ответ на вопрос. Это была проблема с макросом SQLITE_INT_TO_PTR, определенным в sqlite.c, и это была проблема, о которой давно сообщалось с компилятором LLVM_GCC. На самом деле необходимо переопределить макрос, и это решит проблему.

Вот ссылка для того же: http://tribelet.blogspot.com/2008/09/blog-post_08.html Язык поста - японский, но он помог мне выбраться из проблемы.

...