C++ 相等的预处理器测试始终计算为true

C++ 相等的预处理器测试始终计算为true,c++,c-preprocessor,preprocessor-directive,C++,C Preprocessor,Preprocessor Directive,使用此选项: -DME=AWESOME 这是: #if ME==AWESOME #error Im awesome! #endif 结果如下: Registers.cpp:59:2:error:#error我太棒了 但这是: #if ME==NOTSOGREAT #error Im confused! #endif 结果如下: Registers.cpp:59:2:error:#error我搞糊涂了 请注意,执行-DME=AWESOME相当于以以下开头的源文件: #define M

使用此选项:

-DME=AWESOME
这是:

#if ME==AWESOME

#error Im awesome!

#endif
结果如下:

Registers.cpp:59:2:error:#error我太棒了

但这是:

#if ME==NOTSOGREAT

#error Im confused!

#endif
结果如下:

Registers.cpp:59:2:error:#error我搞糊涂了


请注意,执行
-DME=AWESOME
相当于以以下开头的源文件:

#define ME AWESOME
现在让我们看看
#如果我==AWESOME
。代币更换将
ME
更改为
AWESOME
,因此此行的最终版本为:

#if AWESOME==AWESOME
在预处理器中使用
==
时,非
#define
d的字母标记将被
0
替换。因此,这将测试
#如果0==0
这是真的,那么将显示您的错误

现在,看看:

#if ME==NOTSOGREAT
代币更换后为:

#if AWESOME==NOTSOGREAT
如果0==0,这同样等于
,这是真的


如果在此之前还使用了
#define AWESOME 5
,那么您会发现第一个测试为true,而第二个测试为false


我猜你是在试图检测
ME
是否被定义为
AWESOME
,但没有办法做到这一点;您只能测试
ME
是否被定义为等同于
AWESOME
定义为的任何东西。

好的,这是有意义的。但我在供应商提供的代码中看到了这一点:#if(CPU==ARMARCH7M)在makefile中定义之后:CPU=SIMPENTIUM@user1229731您会发现
ARMARCH7M
SIMPENTIUM
被定义为(可能是非零)数值,可能是通过前面包含的头文件
#if
也有意义。但是,每当我测试CPU==ARMARCH7M或CPU==SIMPENTIUM时,它的计算结果总是为true。@uesr1229731请确保已包含定义这些内容的头文件。您可以通过执行
#ifdef ARMARCH7M
检查该符号是否已定义,依此类推。如果您仍然有问题,您可以尝试编写
intt[]={CPU,ARMARCH7M,SIMPENTIUM}
然后检查预处理器输出(如果编译器支持)。(对于gcc,它是
gcc-E
)我将深入了解供应商的代码。我不想成为多余的,我也不喜欢这样,但现在我会这样做:#如果定义(_CPU_ARMARCH7)#elif定义(_CPU_SIMPENTIUM)…C预处理器只处理数字数据,而不是字符串数据。