C++ C++#定义不在cpp文件中读取的值 代码> h < /C>文件: class foo { #define useThis true ... } #if useThis ... generate A code #else ... generate B code #endif

C++ C++#定义不在cpp文件中读取的值 代码> h < /C>文件: class foo { #define useThis true ... } #if useThis ... generate A code #else ... generate B code #endif,c++,compiler-directives,C++,Compiler Directives,在我的.cpp文件中: class foo { #define useThis true ... } #if useThis ... generate A code #else ... generate B code #endif 问题是,#define值没有在.cpp文件中读取,因此发生的情况是A和B都在生成 我将.h文件包含在.cpp文件的顶部。布尔值不能在某些编译器的宏中使用,例如Visual Studio(在g++下工作)。交叉编译方式应为: #define useThis 1

在我的
.cpp
文件中:

class foo {
#define useThis true

...
}
#if useThis
... generate A code
#else
... generate B code
#endif
问题是,
#define
值没有在
.cpp
文件中读取,因此发生的情况是A和B都在生成


我将
.h
文件包含在
.cpp
文件的顶部。

布尔值不能在某些编译器的宏中使用,例如Visual Studio(在g++下工作)。交叉编译方式应为:

#define useThis 1
或者,定义一个没有值的宏,并使用
ifdef
测试它是否已定义:

#define useThis

#ifdef useThis
    ...
#else
    ...
#endif

首先,在这里发布真实代码会有更多帮助。任何合适的编译器都不可能同时生成这两个代码(在本例中,
generatebcode
将是获胜的分支)。其次,使用
1
而不是
true
,因为
true
不是预处理器值。或者,只使用<代码>·α-IFDEF,如果使用(<这)> />代码>使用< <代码> >或>代码>,并省略<代码>真值>代码>值。@ QX C++预处理器识别出“代码>真< /COD>和<代码> false <代码>作为适当的布尔值。由于宏扩展和对已定义宏表达式和has include表达式的求值而进行的所有替换完成后,除true和false之外的所有剩余标识符和关键字都将替换为pp编号0,然后每个预处理标记将转换为一个标记。结果标记包括根据[expr.const]规则计算的控制常量表达式……简言之,
true
不像其他标识符那样被0替换。在该步骤之后,表达式
true
将根据与语言中其他地方的常量表达式求值相同的规则求值,满足
#if
条件。@chris似乎这是与编译器相关的行为。宏中的布尔值不适用于Visual Studio 2013,但适用于g++。我并不感到惊讶。VS已经有很长一段时间不完整的预处理器支持了。我认为它可能会在2017年底加快速度,或者至少在大多数其他标准化问题(如两阶段查找)之后。我尝试了“定义-使用-此1”和“测试-如果使用-此”以及“定义-使用-此”和“测试-如果使用-此”。在这两种情况下,测试都在.h文件中工作,但不在.cpp文件中工作。