C预处理器展开命令行定义的宏后为何追加末尾"1"?
为啥预处理器输出末尾多了个1?
哈哈,这个坑我之前也踩过!核心问题出在你对GCC命令行参数的理解上,咱们拆开来看你的命令:
echo 'MACRO();' | gcc -D'MACRO() hello' -E -P - hello 1
第一步:宏定义的小细节
你想用-D'MACRO() hello'定义带参数的宏MACRO()展开成hello,其实标准写法应该是-D'MACRO()=hello'(用=明确分隔宏名和展开内容)。不过GCC比较宽容,它会把单引号里空格前的MACRO()当作宏名,后面的hello当作展开内容,所以MACRO();确实会被展开成hello;——这部分其实没问题。
第二步:关键的输入文件参数
重点在命令末尾的hello和1!你前面的-是告诉GCC从标准输入(也就是echo输出的内容)读第一个输入源,但你后面加的hello和1会被GCC当成额外的输入文件名。
如果你的当前目录里刚好有个叫1的文件,而且这个文件里就写了字符1,那GCC预处理时就会把标准输入的展开结果,加上hello文件的内容,再加上1文件的内容,一起输出出来。要是hello是空文件,那最后就会看到hello;1——这就是你看到的末尾的1的来源!
如果这两个文件不存在,GCC本来应该报错说找不到文件,但显然你的测试环境里1文件是存在的(或者你不小心创建了它)。
怎么解决?
把命令末尾多余的hello和1删掉就行,或者改成标准的宏定义写法:
echo 'MACRO();' | gcc -D'MACRO()=hello' -E -P -
这样输出就只有hello;,不会有额外的1啦。
内容的提问来源于stack exchange,提问作者anton_rh
相关产品推荐
相关产品推荐

