2013-12-26 3 views
0

мне нужно различать три формы:Отличить пустой макроопределения от 0

#define CONSTANTNAME

#define CONSTANTNAME 0

#define CONSTANTNAME 1

Я видел кто-то использовать подсказку:

#if (CONSTANTNAME - 0)

, но это путает форму без значения и цифру с 0.

Есть ли что-то умнее?

+0

Пожалуйста, помечать с соответствующим языком программирования (ов) –

ответ

0

Можно ли считать, что пустое определение и определение 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 
+0

Мне нужно выполнить три различные ветви для трех случаев, перечисленных в вопросе – user207149

Смежные вопросы