C ++ #define值未在cpp文件中读取
Posted
技术标签:
【中文标题】C ++ #define值未在cpp文件中读取【英文标题】:C++ #define value not being read in cpp file 【发布时间】:2017-02-16 05:58:53 【问题描述】:在我的 C++ .h
文件中:
class foo
#define useThis true
...
在我的.cpp
文件中:
#if useThis
... generate A code
#else
... generate B code
#endif
问题是#define
值没有被读取到.cpp
文件中,所以发生的情况是A 和B 都在生成。
我将.h
文件包含在.cpp
文件的顶部。
【问题讨论】:
首先,在这里发布真实的代码会有所帮助。任何合适的编译器都无法生成这两者(在这种情况下,generate B code
将是获胜的分支)。其次,使用1
而不是true
,因为true
不是预处理器值。那,或者只使用#ifdef useThis
或#if defined(useThis)
并完全省略true
值。
Cannot reproduce.
@Qix C++ 预处理器确实将true
和false
识别为适当的布尔值。
【参考方案1】:
布尔值不能在某些编译器的宏中使用,例如 Visual Studio(尽管在 g++ 下工作)。交叉编译方式应该是:
#define useThis 1
或者,定义一个没有值的宏,并使用ifdef
来测试它是否已经被定义:
#define useThis
#ifdef useThis
...
#else
...
#endif
【讨论】:
我已经在一个现已删除的答案中讨论了这个问题,但是this is incorrect。 由于宏扩展和对定义的宏表达式和 has-include-expressions 的评估执行了所有替换后,所有剩余的标识符和关键字,除了 true 和 false,都被替换为 pp-number 0,并且然后将每个预处理标记转换为一个标记。 和 生成的标记包含根据 [expr.const] 规则评估的控制常量表达式… 简而言之,true
不会像其他标识符那样被替换为 0。在这一步之后,表达式true
的求值规则与语言中其他任何地方的常量表达式求值规则相同,满足#if
条件。
@chris 似乎这是与编译器相关的行为。宏中的布尔值不适用于 Visual Studio 2013,但适用于 g++。
我并不感到惊讶。 VS 长期以来对预处理器的支持不完整。我认为它可能会在 2017 年底或至少在大多数其他标准化问题(如两阶段查找)之后加快速度。
我已经尝试过#define USE_THIS 1 和测试#if USE_THIS 和#define USE_THIS 以及测试#ifdef USE_THIS。在这两种情况下,测试都在 .h 文件中有效,但在 .cpp 文件中无效。以上是关于C ++ #define值未在cpp文件中读取的主要内容,如果未能解决你的问题,请参考以下文章