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

时间:2014-11-04 00:10:17

标签: c++ c-preprocessor preprocessor-directive

使用此:

-DME=AWESOME

和此:

#if ME==AWESOME

#error Im awesome!

#endif

得出这个:

  

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

但是这个:

#if ME==NOTSOGREAT

#error Im confused!

#endif

得出这个:

  

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

1 个答案:

答案 0 :(得分:7)

请注意,执行-DME=AWESOME等同于源文件:

#define ME AWESOME

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

#if AWESOME==AWESOME

在预处理器中使用==时,#define d的字母标记将被0替换为#if 0 == 0。所以这个测试#if ME==NOTSOGREAT 是真的,所以你的错误会被显示出来。

现在,看看:

#if AWESOME==NOTSOGREAT

更换代币后,它是:

#if 0 == 0

再次等同于#define AWESOME 5,这是真的。


如果在此之前你也有ME,那么你会发现第一个测试是真的,但第二个测试是假的。

我猜你试图检测AWESOME是否已定义为ME但是没有办法做到这一点;您只能测试AWESOME是否已定义为与{{1}}定义的内容相同的内容。