【问题标题】:Is it the defacto standard for C compilers to handle "-DFOO" the same as "-DFOO=1"?C编译器处理“-DFFOO”与“-DFFOO = 1”相同的事实标准吗?
【发布时间】:2015-06-05 16:52:35
【问题描述】:

我告诉其他人cc -DFOOcc -DFOO=1 相同,但我不太确定是否所有编译器都支持这一点。那么它是 C 编译器的标准吗?

(在接受的答案的启发下,找到了最近的 POSIX c99 标准,2016 版。仅供参考。)

【问题讨论】:

    标签: c compilation c-preprocessor


    【解决方案1】:

    它不是 C 编译器的标准,尽管它是 POSIX 兼容系统的标准。见the cc manual

    【讨论】:

      【解决方案2】:

      ISO 标准只要求未定义的宏计算为零。因此,虽然将定义的值设为非零是有意义的,但它不是必需的。值 1 作为非零值也有意义,因为这是一个真正的布尔表达式在转换为整数时的值。

      因此,虽然它不是“标准”,但它可能是最有可能和最不反常的实现。但是,您不应该真正提倡按值对此类宏进行显式测试,因为这样做表明明显缺乏谨慎。此类宏应仅针对定义而非值进行测试。


      请注意,如果FOO 未定义,则#if defined FOO FOO 形式的表达式解析为#if 0L,如果FOO 已定义,则解析为#if 1L,但这是对defined FOO 的评估并且什么也不说关于FOO的值。

      FOO 已定义但没有明确分配值的情况下,以下行为具有明确定义:

      #ifdef FOO
      #ifndef FOO
      #if defined FOO
      #if !defined FOO
      #if FOO != 0
      #if FOO == 0
      

      这可能是足够的选择不提倡:

      #if FOO == 1
      

      【讨论】:

      • 您所指的 ISO 标准 的任何链接?
      • @whjm :在这种情况下,信任stackoverflow.com/questions/5085392/… 给出的答案。
      • @Clifford 我不知道你想用“在这种情况下定义以下内容”块说什么,你能重新措辞吗?
      • @MattMcNabb :问题中没有明确提到 gcc,问题是关于 all 编译器的行为是否正确。一般来说效果应该至少和#define FOO一样。
      • @whjm 问题是关于编译器命令行开关 -DFOO 。 C 标准没有定义编译器命令行开关。根据此线程中报告的结果,似乎许多编译器将-DFOO 实现为#define FOO 1
      猜你喜欢
      • 2014-02-18
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      相关资源
      最近更新 更多