将空宏定义与0区分开来

时间:2013-12-26 13:33:52

标签: macros definition c-preprocessor

我需要区分这三种形式:

#define CONSTANTNAME

#define CONSTANTNAME 0

#define CONSTANTNAME 1

我看到有人使用提示:

#if (CONSTANTNAME - 0)

但是这会混淆没有值的形式和带有0的形式。

有更聪明的东西吗?

1 个答案:

答案 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 FOOdefined(FOO)进行测试,因为它与0无法区分。

示例代码:

#if !defined(FOO)
... handle undef
#elif -FOO+1 == 1
... handle 0
#elif FOO+0 == 0
... handle empty
#else
... handle 1
#endif