【问题标题】:What happens when a C preprocessor macro is defined twice?当 C 预处理器宏被定义两次时会发生什么?
【发布时间】:2015-12-02 13:24:36
【问题描述】:

我定义一个宏两次如下:

#define a 2  
#define a 3   

我认为代码中任何出现的a 都会被2 替换,而当遇到#define a 3 时,代码中没有更多的as 可用以替换为3,所以2 会优先。

但是当我执行它时a被3替换了,为什么?

【问题讨论】:

  • 这不是警告吗?你能解释一下为什么你不想精确定义这种情况吗?
  • 是的,这是一个警告。我只是想知道这是如何工作的。

标签: c macros c-preprocessor


【解决方案1】:

如果你像这样定义一个宏两次,编译器至少应该给你警告,如果不是错误的话。这是一个错误。

§6.10.3/2:当前定义为类对象宏的标识符不应由另一个#define 预处理指令重新定义,除非第二个定义是类对象宏定义并且两个替换列表相同。

您可以通过显式删除之前的定义来重新定义宏:

#define a 2
/* In this part of the code, a will be replaced with 2 */
...

#undef a
#define a 3
/* From here on, a will be replaced with 3 */
...

宏替换发生在读取文件时,使用在文件中激活的宏定义,除了在(大多数)预处理指令中。

§6.10/7:预处理指令中的预处理标记不受宏扩展的影响,除非另有说明。

§6.10.3.5/1:宏定义持续(独立于块结构)直到遇到相应的#undef 指令或(如果没有遇到)直到预处理翻译单元结束。

【讨论】:

    【解决方案2】:

    a 不会被 #define a 3 中的 2 替换,因为这也是一个预处理器。

    处理#define a 2后,a的值为2,但被下一条语句#define a 3覆盖

    【讨论】:

    • 是的,你是对的,但恕我直言,你需要进一步扩展你的答案以适合这个特定问题。
    【解决方案3】:

    我不清楚你希望看到什么。

    第二行覆盖了第一行中a 的定义。

    此后遇到的任何a 都将替换为3

    【讨论】:

    • 我的疑问是“#define a 2”会在“#define a 3”行以及代码的其他部分将“a”替换为2。因此,第二个宏定义将成为“#define 2 3”。现在 "2" 被 3 替换了。是这样工作的吗
    • 不,#define-d 宏的名称在定义中从不扩展
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 2013-10-05
    相关资源
    最近更新 更多