【问题标题】:Can a #define be assigned the result of defined?可以为#define 分配定义的结果吗?
【发布时间】:2017-01-20 22:03:24
【问题描述】:

以下代码的结果是用 C 还是 C++ 定义的?

#define FOO
#define BAR defined(FOO)
#if BAR
    int x = 1;
#else
    int x = 2;
#endif

【问题讨论】:

  • 请注意,这与答案中的解决方案(ifdef-define 方法)不同。你的是后期绑定的,这意味着 BAR 可以扩展到代码的不同部分中的不同内容,具体取决于 FOO 的定义位置。示例:coliru.stacked-crooked.com/a/37e940a76f0fa896
  • Eww,我收回了。我希望这是试图在预处理器中降低 UB 的人们解决的问题之一,因为这相当不直观。

标签: c++ c c-preprocessor standards


【解决方案1】:

在条件指令中使用defined 作为扩展被视为未定义行为

如果令牌 defined 是作为此替换的结果生成的 处理 或使用defined 一元运算符不匹配其中之一 宏替换之前的两个指定形式,行为是 未定义。

这些宏名称、或标识符defined都不应是 #define#undef 预处理指令的主题

如果defined 运算符是宏扩展的结果,则 C 标准说行为是未定义的。 GNU cpp 将其视为 真正定义的运算符并对其进行正常评估。它会警告 如果您使用命令行,则无论您的代码在何处使用此功能 选项“-pedantic”,因为其他编译器可能会以不同的方式处理它。

【讨论】:

  • 谢谢!你有那个报价的来源吗?
  • 我建议先给出标准的参考,因为这是确定的。特定实现的行为不是。 (即标准是评估编译器/预处理器正确性的基础,而不是相反)。
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2018-03-16
  • 2020-06-22
相关资源
最近更新 更多