相等的预处理程序测试始终评估为true

use*_*731 3 c++ c-preprocessor preprocessor-directive

使用这个:

-DME=AWESOME
Run Code Online (Sandbox Code Playgroud)

还有这个:

#if ME==AWESOME

#error Im awesome!

#endif
Run Code Online (Sandbox Code Playgroud)

得出这个:

Registers.cpp:59:2:错误:#error我真棒!

但是这个:

#if ME==NOTSOGREAT

#error Im confused!

#endif
Run Code Online (Sandbox Code Playgroud)

得出这个:

Registers.cpp:59:2:错误:#error我很困惑!

M.M*_*M.M 7

请注意,执行-DME=AWESOME操作等同于以下开头的源文件:

#define ME AWESOME
Run Code Online (Sandbox Code Playgroud)

现在让我们来看看#if ME==AWESOME.令牌替换更改MEAWESOME,因此此行的最终版本为:

#if AWESOME==AWESOME
Run Code Online (Sandbox Code Playgroud)

当您==在预处理器中使用时,一个不是#define其他任何东西的字母标记将被替换为0.所以这个测试#if 0 == 0是真的,所以你的错误会显示出来.

现在,看看:

#if ME==NOTSOGREAT
Run Code Online (Sandbox Code Playgroud)

令牌替换后,它是:

#if AWESOME==NOTSOGREAT
Run Code Online (Sandbox Code Playgroud)

这也是等同的#if 0 == 0,这是真的.


如果你#define AWESOME 5之前也有,那么你会发现第一个测试是真的,但第二个测试是假的.

我猜你试图检测是否ME已被定义,AWESOME但没有办法做到这一点; 你只能测试是否ME被定义为与定义的相同的东西AWESOME.