代码之家  ›  专栏  ›  技术社区  ›  anton_rh

C预处理器在扩展命令行中定义的宏后添加尾随的“1”

  •  2
  • anton_rh  · 技术社区  · 6 年前
    $ echo 'MACRO();' | gcc -D'MACRO() hello' -E -P -
    hello 1;
          ^ why 1?!!!!
    

    你知道它为什么在扩展宏后添加尾随的“1”吗?

    1 回复  |  直到 6 年前
        1
  •  6
  •   anton_rh    6 年前

    来自 GCC preprocessor documentation :

    -D名称

    将名称预先定义为宏,定义为1。

    -d name=定义

    使用定义定义将名称预先定义为宏。定义的内容被标记化和处理,就好像它们出现在定义指令的翻译阶段3。

    所以你想要:

    $ echo 'MACRO();' | gcc -D'MACRO()=hello' -E -P -
    hello;
    

    注意定义中的等号。

    至于它为什么不使用它做什么:空格是预处理器符号定义中的分隔符。所以预处理器正在给符号分配“hello”。然后它注意到定义中没有等号,所以它也附加了默认值“1”。这不是一个bug,只是在预处理器符号中出现了一个空格。

    $ echo 'MACRO();' | gcc -D'MACRO() hello=foo' -E -P -
    hello foo;