在我的C++ .h
文件:C++的#define值
class foo {
#define useThis true
...
}
在我.cpp
文件:
#if useThis
... generate A code
#else
... generate B code
#endif
的问题是,#define
值不被读入.cpp
文件,所以发生的事情是正在生成A和B.
我在.cpp
文件的顶部包含.h
文件。
在我的C++ .h
文件:C++的#define值
class foo {
#define useThis true
...
}
在我.cpp
文件:
#if useThis
... generate A code
#else
... generate B code
#endif
的问题是,#define
值不被读入.cpp
文件,所以发生的事情是正在生成A和B.
我在.cpp
文件的顶部包含.h
文件。
布尔值不能用于某些编译器的宏,如Visual Studio(尽管在g ++下工作)。一个交叉编译的方法应该是:
#define useThis 1
或者定义没有值的宏,并使用ifdef
来测试,如果它被定义为:
#define useThis
#ifdef useThis
...
#else
...
#endif
我已经在一个现在被删除的答案中解决了这个问题,但[这是不正确的](http://eel.is/c++draft/cpp.cond)。 *由于宏扩展以及对已定义的宏表达式和has-include表达式的评估而进行的所有替换之后,除了true和false之外,所有剩余的标识符和关键字都被替换为pp-number 0,然后每个预处理令牌转换为令牌*和*结果令牌包含控制常量表达式,该表达式根据[expr.const] ...的规则进行评估... * – chris
简而言之,'true'不会被其他标识符替换为0 。在该步骤之后,根据与语言中其他地方的常量表达式评估相同的规则评估“真”表达式,满足'#if'条件。 – chris
@chris似乎它是一个编译器相关的行为。宏中的布尔值不适用于Visual Studio 2013,但适用于g ++。 –
首先,发布真正的代码是要帮助更多的在这里。任何合适的编译器都不会生成这两个(在这种情况下,“生成B代码”将成为获胜的分支)。其次,使用'1'而不是'true',因为'true'不是预处理器的值。那个,或者只是使用'#ifdef useThis'或'#if defined(useThis)'并且完全省略'true'的值。 – Qix
[不能重现。](http://melpon.org/wandbox/permlink/iVXMEjUZLFjJeMSZ) – chris
@Qix C++预处理程序**确实将** true和'false'识别为合适的布尔值。 – Angew