如果将MYHEADER
定义为空(其替换列表中没有令牌),您得到的消息是由GCC生成的.如果您正在使用的命令行处理器(也称为shell )使用<some.h>
来指示文件重定向,<
表示从some.h
获取输入,>
使用紧随其后的-o
来指示写入-o
,那么它将给-DMYHEADER=
留下一个空的替换列表.
如果是这样的话,一个修复方法可能是引用交换机:
arm-none-eabi-gcc -c "-DMYHEADER=<some.h>" -o sample.o sample.c
下面是两个测试,除了try 上面的命令:
判断您的目录是否包含名为-o
的文件.如果是这样,它是由间接创建的,证实了这就是正在发生的事情.
创建一个名为x.c
的文件,在其中放入MYHEADER
(不放入任何其他内容),然后执行arm-none-eabi-gcc -E x.c -DMYHEADER=<some.h>
.如果命令行处理器抱怨>
后面没有文件名,那么就证实了这一假设.如果它执行该命令,或者如果它在>
之后添加foo
之后执行命令,则输出将显示MYHEADER
被替换为什么.(-E
switch 请求进行预处理,因此如果将-DMYHEADER=
传递给GCC,则包含MYHEADER
的单行将被空行替换.)
这个假设的一个问题是命令行处理器应该抱怨它不能为输入重定向打开some.h
.但是,您的目录中可能有一个同名的文件,这将满足命令行处理器的要求.
另一种可能性是C标准没有完全指定如何处理#include
中宏替换产生的令牌.当<name.h>
直接出现在#include
中时,它被一个特殊的语法标记h-char-sequence处理.当使用宏替换时,该标准规定,在C 2018 6.10.2 4中:
…将<
和>
预处理令牌对或一对"
字符之间的一系列预处理令牌组合成单个报头名预处理令牌的方法是实现定义的.
我认为这不是问题所在,因为对编译器资源管理器的测试表明,GCC以一种普通的合适方式处理了用<stdio.h>
替换MYHEADER
的操作.