如何使用特定工作目录部分预处理C文件

时间:2017-08-20 19:55:12

标签: c c-preprocessor

我想扩展我的工作目录的C文件的include指令;不是系统目录。

我尝试了以下内容:

gcc -E -nostdinc -I./ input.c

但是当它无法在input.c中找到包含的系统头时,它会停止预处理。我希望它在找不到它时复制include指令并保持对文件的预处理。

2 个答案:

答案 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>|'