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"), но на самом деле они не используются.

Скриншот Xcode

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

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

Подробнее см. в официальной документации .

Другие вопросы по тегам