xcconfig: различные макросы препроцессора для отладки / выпуска
Я создал и применил простой файл.xcconfig, содержащий
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;
}
Теперь мне интересно, почему в main.cpp ни FOODEBUG, ни FOORELEASE не определены??!
Как и ожидалось, настройки сборки показывают две строки моего файла.xcconfig ("Любая архитектура | Любой SDK"), но на самом деле они не используются.
Как я мог этого добиться?
2 ответа
Если у вас есть макрос препроцессора, вам нужно присвоить ему значение, чтобы можно было использовать его как вы, см. Пример экрана с одной из моих настроек проекта:
Причина, по которой вы можете получить доступ к DEBUG, заключается в том, что #if
а также #ifdef
,#if
будет верно, когда макрос существует, #ifdef
если оно имеет ненулевое значение. Я предлагаю всегда присваивать значение 1 для сохранения, потому что я не уверен, что вышесказанное верно для всех версий компилятора.
ОБНОВИТЬ:
Не знал, что раньше, но, кажется, config=Debug
не работает. Хотя макросы становятся видимыми в настройках, они не наследуются. Что работает, так это 2 файла xcconfig, подобных этому:
Release.xcconfig:
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) FOORELEASE=1
Debug.xcconfig
#include "Release.xcconfig"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) FOODEBUG=1
Смотрите также ответ Джеймса Мура здесь: Как добавить значения в переменные xcconfig?
Вам нужно определить макрос препроцессора следующим образом:
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = $(inherited) FOODEBUG=1
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = $(inherited) FOORELEASE=1
Подробнее см. в официальной документации .