2017-02-16 72 views
0

在我的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文件。

+1

首先,发布真正的代码是要帮助更多的在这里。任何合适的编译器都不会生成这两个(在这种情况下,“生成B代码”将成为获胜的分支)。其次,使用'1'而不是'true',因为'true'不是预处理器的值。那个,或者只是使用'#ifdef useThis'或'#if defined(useThis)'并且完全省略'true'的值。 – Qix

+1

[不能重现。](http://melpon.org/wandbox/permlink/iVXMEjUZLFjJeMSZ) – chris

+1

@Qix C++预处理程序**确实将** true和'false'识别为合适的布尔值。 – Angew

回答

0

布尔值不能用于某些编译器的宏,如Visual Studio(尽管在g ++下工作)。一个交叉编译的方法应该是:

#define useThis 1 

或者定义没有值的宏,并使用ifdef来测试,如果它被定义为:

#define useThis 

#ifdef useThis 
    ... 
#else 
    ... 
#endif 
+0

我已经在一个现在被删除的答案中解决了这个问题,但[这是不正确的](http://eel.is/c++draft/cpp.cond)。 *由于宏扩展以及对已定义的宏表达式和has-include表达式的评估而进行的所有替换之后,除了true和false之外,所有剩余的标识符和关键字都被替换为pp-number 0,然后每个预处理令牌转换为令牌*和*结果令牌包含控制常量表达式,该表达式根据[expr.const] ...的规则进行评估... * – chris

+0

简而言之,'true'不会被其他标识符替换为0 。在该步骤之后,根据与语言中其他地方的常量表达式评估相同的规则评估“真”表达式,满足'#if'条件。 – chris

+0

@chris似乎它是一个编译器相关的行为。宏中的布尔值不适用于Visual Studio 2013,但适用于g ++。 –