【问题标题】:Why do (1 && !A) in c++ pre-processor为什么 (1 && !A) 在 C++ 预处理器中
【发布时间】:2021-11-11 22:17:28
【问题描述】:

在一些 C++ 文件中,我发现:

#ifndef UE_WITH_CHEAT_MANAGER
#define UE_WITH_CHEAT_MANAGER (1 && !UE_BUILD_SHIPPING)
#endif

来自 CheatManager.h。

有什么区别:

#ifndef UE_WITH_CHEAT_MANAGER
#define UE_WITH_CHEAT_MANAGER (!UE_BUILD_SHIPPING)
#endif

是为了防止某些特定编译器出现警告吗?

附加信息:

  • UE_BUILD_SHIPPING 默认为 0,并设置为 1 用于发布构建(分发给消费者/玩家的构建)。
  • UE_WITH_CHEAT_MANAGER 用于从编译中排除部分代码。

(已编辑以回答 cmets 中的请求。)

【问题讨论】:

  • 尝试使用A("frog") 看看会发生什么。 1 && !B 正在寻找数字表达式。 (!B) 表达式将为非数字类型提供未定义的值。
  • @ThomasMatthews: !"frog" 是有效的,对吧?它正在测试"frog" 是否为空指针,但它从来都不是,因此!"frog" 的计算结果为0。 1 && !"frog" 也是如此,所以我在这里看不出两者有什么区别。
  • 如果! 和&& 运算符重载,它们当然会有所不同。
  • 宏是否有用取决于A的上下文。例如,能够修改一堆测试以从单个宏评估为 false 可能很有用。
  • 您能在简化之前发布来自虚幻引擎的确切代码吗?里面可能有什么相关的东西吗?

标签: c++ c-preprocessor


【解决方案1】:

没有人是完美的,即使是虚幻引擎的作者。

抛开任何可能的运算符重载,两个表达式的类型和值是相同的。我怀疑(这只是一种预感),作者忘记了 (!B) 的类型是 C++ 中的 bool。

(1 && !B) 更明确地可能是 bool 类型,因为它包含 && 运算符。

【讨论】:

  • 如果B 是一个重载operator! 的类,那么它可以返回任何类型,所以在这种情况下它们是不同的。这是一个非常小众的场景。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2018-03-09
  • 1970-01-01
相关资源
最近更新 更多