我想扩展我的工作目录的C文件的include指令;不是系统目录。
我尝试了以下内容:
gcc -E -nostdinc -I./ input.c
但是当它无法在input.c
中找到包含的系统头时,它会停止预处理。我希望它在找不到它时复制include指令并保持对文件的预处理。
答案 0 :(得分:1)
如果您的input.c
文件包含某些系统标头,那么预处理器在无法找到它们时会崩溃是正常的。
您可以先使用grep -v
删除代码中的所有#include
系统标头,实现类似的功能(列表并非详尽无遗):
grep -vE "(stdio|stdlib)\.h" code.c > code_.c
你得到了例如:
#define EXITCODE 0
int main(){
int i = EOF;
printf("hello\n");
return EXITCODE;
}
然后预处理:
S:\c>gcc -E code_.c
# 1 "code_.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "code_.c"
int main(){
int i = EOF;
printf("hello\n");
return 0;
}
请注意,预处理器并不关心未定义的函数或宏。您可以预处理代码(并扩展宏),而不是系统代码。
当然,您还必须处理所有包含的文件。这意味着需要额外的一层工具来创建临时源文件并从那里开始工作。
答案 1 :(得分:1)
我发现utility完全符合我的要求:
$ cpphs --nowarn --nomacro -I./ input.c | sed -E 's|#line 1 "missing file: (.*)"|#include <\1>|'