2014-12-15 4 views
1

Я пытаюсь создать статическую библиотеку C++, используя Xcode. Я получаю ошибку сборки для идентификатора DEBUG в перечислении ниже, не уверен, почему это происходит. Я могу скомпилировать его, используя Clang ++ из терминала. Почему компиляция не работает в Xcode?Ошибка компиляции идентификатора DEBUG в Xcode

Ошибка:

Parse Issue 
temp_1.h:9:5: Expected identifier 

temp_1.h

enum LogLevel { 

    DONT_PRINT = 0, 
    SPEW  = 1, 
    DEBUG  = 2, 
    INFO  = 3, 
    WARNING = 4, 
    ERROR  = 5, 
    FATAL  = 6, 
    INVALID      = 7, 
    NO_EXIT_ON_ERROR   = 8, 
    MANDATORY     = 9 
}; 

class temp_1 {  
public: 
    temp_1(); 
    int get_var(); 
    void set_var(int _var); 

private: 
    int var;  
}; 

temp_1.cpp:

#include "temp_1.h" 

temp_1::temp_1() {   
    var = DEBUG; 
}  
int temp_1::get_var() { 
    return var; 
}  
void temp_1::set_var(int _var) {  
    var = _var; 
} 

ответ

1

Много строительных сред defin е макрос препроцессора DEBUG при компиляции кода в режиме отладки, так что вы можете написать

#ifdef DEBUG 
// do something in debugging mode only 
#endif 

Похоже, в вашем Xcode сборки, DEBUG определяется то, что не является идентификатором, может быть DEBUG=1 или DEBUG= , Поэтому ваш код после предварительной обработки выглядит как SPEW = 1, 1 = 2, или SPEW = 1, = 2,.

Не забудьте использовать идентификатор DEBUG в своем коде. В C вы обычно ставите префикс перед этими идентификаторами: LOG_LEVEL_DONT_PRINT, LOG_LEVEL_SPEW, LOG_LEVEL_DEBUG и т. Д. В C++ пространства имен в большинстве случаев делают такие префиксы ненужными и неминуемыми. Тем не менее, избегайте всех заглавных DEBUG. Вы можете назвать этот идентификатор иначе, или использовать Spew, Debug и т. Д. И зарезервировать все шапки для препроцессора.

Если вы не можете избежать использования идентификатора DEBUG, вы можете позволить программе строить, убедившись, что ваша среда сборки никогда не определяет ее как макрос процессора. Если вы хотите получить торт и съесть его, вы можете сделать лучше: убедитесь, что либо DEBUG не определен, либо он определен как DEBUG (т. Е. Ничего или -UDEBUG, или -DDEBUG=DEBUG в командной строке компилятора). Когда макрос препроцессора расширяется сам по себе, он передает идентификатор без изменений на следующий этап компилятора (так что DEBUG будет действовать как идентификатор), но будут компилироваться блоки в директиве условной компиляции #ifdef DEBUG ... #endif.

+0

Спасибо, я согласен с Вашим мнением, к сожалению, выше моментального снимка из уже существующей вспомогательной библиотеки и используется для нескольких проектов, поэтому я сомневаюсь, что я его модифицирую. – Jim

+0

@ Jim В этом случае я считаю, что лучше всего определить DEBUG = DEBUG, а не DEBUG = 1 или некоторые такие, см. Мое редактирование. – Gilles

+0

в «Настройках сборки», где определены макросы предварительной обработки, я нашел DEBUG = 1, о котором вы упомянули выше, удалив это. – Jim

Смежные вопросы