我需要区分这三种形式:
#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
=>假的。
如果是0
,-0+1 == 1
=>真。
如果没有定义,则应用无法识别的令牌的默认cpp替换,这是0
所以它是真的。
<强>更新强>
如果您想要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