2014-11-04 4 views
3

Используя это:Препроцессор для равенства всегда оценивает истинный

-DME=AWESOME 

и это:

#if ME==AWESOME 

#error Im awesome! 

#endif 

дает это:

Registers.cpp:59:2: error: #error Im awesome!

но:

#if ME==NOTSOGREAT 

#error Im confused! 

#endif 

дает это:

Registers.cpp:59:2: error: #error Im confused!

+0

Препроцессор C обрабатывает только числовые, а не строковые данные. –

ответ

7

Обратите внимание, что делает -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 было определено как.

+0

Хорошо, это имеет смысл. Но я вижу это в коде поставщика: #if (CPU == ARMARCH7M) после того, как он определен в make-файле: CPU = SIMPENTIUM – user1229731

+0

@ user1229731 Вы обнаружите, что 'ARMARCH7M' и' SIMPENTIUM' определены как (возможно, ноль) числовые значения где-то, возможно, с помощью файла заголовка, который был включен до этого '# if' –

+0

. Это также имеет смысл. Однако всякий раз, когда я тестирую CPU == ARMARCH7M или CPU == SIMPENTIUM, он всегда оценивает значение true. – user1229731