Можно ли считать, что пустое определение и определение 1
эквивалентны с 0
- это другое? Я почти уверен, что вопрос уже существует в stackoverflow, но я не могу его найти.
Вот Usenet нить на ту же тему: https://groups.google.com/d/msg/comp.lang.c/jkI2vz8ZxmE/1-kOKCQ2MrwJ
Несколько ответов приведены там. Умнейший один выглядит следующим образом:
#if -CONSTANTNAME+1 == 1
... the "no CONSTANTNAME" branch
#else
... the "yes CONSTANTNAME" branch
#endif
CONSTANTNAME
Если пусто, -+1 == 1
=> ложным.
Если это 1
, -1+1 == 1
=> false.
Если это 0
, -0+1 == 1
=> true.
Если он не определен, применяется замена cpp по умолчанию для непризнанных токенов, и это 0
, так что это правда.
UPDATE
Если вы хотите 3 ветви, вы можете использовать тест -FOO+0 == 1
и добавить дополнительный тест как FOO+0==0
. Посмотрите на результаты, которые вы можете получить:
Value of `FOO` `-FOO+1==1` `FOO+0==0`
empty string false true
1 false false
0 true true
Если четвёртом случае, макро не определено, интересно, она должна быть проверена с #ifdef FOO
или defined(FOO)
, так как он в противном случае ничем не отличается от 0
.
Пример кода:
#if !defined(FOO)
... handle undef
#elif -FOO+1 == 1
... handle 0
#elif FOO+0 == 0
... handle empty
#else
... handle 1
#endif
Пожалуйста, помечать с соответствующим языком программирования (ов) –