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

ant*_*_rh 2 c gcc c-preprocessor

$ echo 'MACRO();' | gcc -D'MACRO() hello' -E -P -
hello 1;
      ^ why 1?!!!!
Run Code Online (Sandbox Code Playgroud)

你知道为什么在扩展宏后它会增加尾随"1"吗?

Bob*_*sen 6

GCC预处理器文档:

-D名字

将名称预定义为宏,定义为1.

-D name = definition

将名称预定义为宏,具有定义定义.定义的内容被标记化并处理,就好像它们在#define指令的翻译阶段3中出现一样.

所以你要:

$ echo 'MACRO();' | gcc -D'MACRO()=hello' -E -P -
hello;
Run Code Online (Sandbox Code Playgroud)

注意定义中的等号.

至于为什么它没有它做它做的事情:空间是预处理器符号定义中的分隔符.因此预处理器为符号分配"hello".然后它注意到定义中没有等号,所以它也附加了默认的"1".这不是一个错误,只是在预处理器符号中的"空间"的情况.

$ echo 'MACRO();' | gcc -D'MACRO() hello=foo' -E -P -
hello foo;
Run Code Online (Sandbox Code Playgroud)