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我很困惑!
请注意,执行-DME=AWESOME操作等同于以下开头的源文件:
#define ME AWESOME
Run Code Online (Sandbox Code Playgroud)
现在让我们来看看#if ME==AWESOME.令牌替换更改ME为AWESOME,因此此行的最终版本为:
#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.