Обратите внимание, что делает -DME=AWESOME
эквивалентно исходного файла, начиная с:
#define ME AWESOME
Теперь давайте посмотрим на #if ME==AWESOME
. Токен замена меняет ME
на AWESOME
, поэтому окончательная версия этой линии:
#if AWESOME==AWESOME
При использовании ==
в препроцессоре, алфавитном знак, который не #define
d к чему-либо другому, заменяется на 0
. Таким образом, это тесты #if 0 == 0
, что верно, поэтому отображается ваша ошибка.
Теперь смотрите:
#if ME==NOTSOGREAT
После замены лексем это:
#if AWESOME==NOTSOGREAT
который снова эквивалентно #if 0 == 0
, что это правда.
Если вы имели #define AWESOME 5
перед этим, то вы обнаружите, что первый тест верно, но второй тест является ложным.
Я думаю, вы пытаетесь определить, был ли ME
определен в AWESOME
, но нет никакого способа сделать это; вы можете проверить только, был ли ME
определен как что-то равное тому, что AWESOME
было определено как.
Препроцессор C обрабатывает только числовые, а не строковые данные. –