Использование true и false в макросах в C99

Я пишу код, используя настраиваемый компилятор gcc, который поддерживает подмножество C99. Используя параметры компилятора, я определил такой макрос:

ENABLE_LOGGING=true

Я использую его в своем коде следующим образом:

#if ENABLE_LOGGING
#define LOG(foo) { log(foo); }
#else
#define LOG(foo)
#endif

Просто оказалось, что это не работает надежно. Иногда используется код, содержащий LOG, иногда используется emtpy LOG (тот же проект, те же настройки компилятора).

При изменении аргумента макроса на:

ENABLE_LOGGING=1

все работает.

Я понимаю, что true может быть неизвестен препроцессору. Но тогда почему это работает в большинстве случаев? И почему я не получаю предупреждений или ошибок во время компиляции модулей, где это не работает?


person Silicomancer    schedule 09.08.2016    source источник
comment
ENABLE_LOGGING=true не является допустимым объявлением макроса C. Вы имели в виду #define ENABLE_LOGGING true или что-то другое?   -  person Lundin    schedule 09.08.2016
comment
Я определил его, используя параметры компилятора, а не код. Выше приведен формат, используемый для параметров компилятора.   -  person Silicomancer    schedule 09.08.2016


Ответы (1)


#define hehe true
#if hehe
#error hehe
#else
#error haha
#endif

будет #error haha, потому что hehe расширяется до true, а true будет заменено на 0, потому что

§6.10.1¶4 все оставшиеся идентификаторы (в том числе лексически идентичные ключевым словам) заменяются на pp-номер 0

Но если вам случится #include <stdbool.h> до #if, это будет #error hehe, потому что

§7.18 Заголовок определяет четыре макроса. …

¶3 Остальные три макроса подходят для использования в директивах предварительной обработки #if. Это true, которое расширяется до целочисленной константы 1

person a3f    schedule 09.08.2016