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++ 预处理器确实truefalse 识别为适当的布尔值。 【参考方案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文件中读取的主要内容,如果未能解决你的问题,请参考以下文章

从C ++代码成功进行C#回调后,“运行时检查失败#0 - ESP的值未在函数调用中正确保存”

该值未正确存储在数组中

长 URL 值未在 Codeigniter 中提交

道具值未在 vuejs 中呈现

反应:useContext 值未在嵌套函数中更新

IBInspectable 属性值未在 xib 中更新