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预处理器只处理数字数据,而不是字符串数据。