2014-02-12 3 views
3

Я создал и применил простой файл, содержащий .xcconfigxcconfig: Различные макросы препроцессора для отладки/Release

GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = FOODEBUG 
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = FOORELEASE 

и main.cpp, содержащий

#include <iostream> 

// This warning IS shown 
#if DEBUG 
#warning DEBUG is set to 1 
#endif 

// This warning IS NOT shown 
#ifdef FOODEBUG 
#warning FOODEBUG is set 
#endif 

// This warning IS NOT shown 
#ifdef FOORELEASE 
#warning FOORELEASE is set 
#endif 

int main(int argc, const char * argv[]) 
{ 
    // insert code here... 
    std::cout << "Hello, World!\n"; 
    return 0; 
} 

Теперь я задаюсь вопросом, почему в основной .cpp, ни FOODEBUG, ни FOORELEASE не определены ??!

Как и ожидалось, настройки сборки показывают две строки моего файла .xcconfig («Любая архитектура | Любой SDK»), но они фактически не используются.

Xcode screenshot

Как я могу добиться этого?

ответ

2

Если у вас есть макрос препроцессора вам нужно, чтобы придать ему значение, чтобы иметь возможность использовать его как вы смотрите скриншот одного из моих проектов установок в качестве образца:

enter image description here

причина, по которой вы можете получить доступ к DEBUG, - это различие в поведении между #if и #ifdef. #if будет истинным, если макрос существует, #ifdef, если он имеет ненулевое значение. Я предлагаю всегда назначать значение, которое нужно сохранить, потому что я не уверен, что это верно для всех версий компилятора.

UPDATE:
Не знаю, что и раньше, но это, кажется config=Debug не работает. Хотя макросы становятся видимыми в настройках, они не наследуются. Что работа является 2 xcconfig файлы примерно так:

Release.xcconfig:

GCC_PREPROCESSOR_DEFINITIONS = $(inherited) FOORELEASE=1 

Debug.xcconfig

#include "Release.xcconfig" 
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) FOODEBUG=1 

Также см Джеймс Moores ответить здесь: How to append values in xcconfig variables?

+0

Как это отвечает на вопрос? – AndiDog

+0

Извините, что неясно, см. Мой отредактированный ответ. Я не говорю об изменении макросов, но назначая ненулевое значение. Надеюсь, что поможет – dogsgod

+0

Тем не менее, я не понимаю, как это связано с моим вопросом. Разница очень ясна для меня, но ни один из макросов не определен * вообще * по Xcode. Значение или нет здесь не имеет значения. – AndiDog