我有C代码文件包含以下内容:

#include MYHEADER

我知道这样包含使用变量是一个坏的做法,但它不是我的代码,我只是想编译它.我希望MYHEADER变量有<some_header.h>值,而不是"some_header.h". 我试过很多方法来通过它,到目前为止没有一个成功.

arm-none-eabi-gcc -c -DMYHEADER=<some.h> -o sample.o sample.c不起作用, 我总是错误:#include expects "FILENAME" or \<FILENAME\>.在Windows上使用ARM GCC编译器.

请注意

推荐答案

如果将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被替换为什么.(-Eswitch 请求进行预处理,因此如果将-DMYHEADER=传递给GCC,则包含MYHEADER的单行将被空行替换.)

这个假设的一个问题是命令行处理器应该抱怨它不能为输入重定向打开some.h.但是,您的目录中可能有一个同名的文件,这将满足命令行处理器的要求.

另一种可能性是C标准没有完全指定如何处理#include中宏替换产生的令牌.当<name.h>直接出现在#include中时,它被一个特殊的语法标记h-char-sequence处理.当使用宏替换时,该标准规定,在C 2018 6.10.2 4中:

…将<>预处理令牌对或一对"字符之间的一系列预处理令牌组合成单个报头名预处理令牌的方法是实现定义的.

我认为这不是问题所在,因为对编译器资源管理器的测试表明,GCC以一种普通的合适方式处理了用<stdio.h>替换MYHEADER的操作.

C++相关问答推荐

错误:在.h程序中重新定义 struct

通过MQTT/蚊子发送大文件—限制在4MB

手动矢量化性能差异较大

C中是否有语法可以直接初始化一个常量文本常量数组的 struct 成员?

C语言中的strstr问题

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

如何在C中使printf不刷新标准输出?

函数内的局部字符指针

如何在C语言中正确打印图形

在另一个函数中使用realloc和指针指向指针

MacOS下C++的无阻塞键盘阅读

C语言中神秘的(我认为)缓冲区溢出

C语言中浮点数的取整方式浮点数尾数超过23位时如何取整剩余部分

C-try 将整数和 struct 数组存储到二进制文件中

向左移位3如何得到以字节为单位的位数?

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

这些表达式是否涉及 C 中定义的复合文字?

GDB 跳过动态加载器代码

是什么阻止编译器优化手写的 memcmp()?