覆盖CPP输出

时间:2016-01-20 10:19:30

标签: c-preprocessor compiler-flags

在工作中,我们使用GNU CPP作为自定义语言的预处理器。预处理器下游的流程理解行标记(格式为# 123 foo-bar.extension)并将其信息嵌入到最终编译源中。

这一切都很好,但是整个过程的工作原理是将所有内容写入临时目录,并在将输入传递给CPP之前对输入进行一些(预)处理。此转换不会更改行号。结果,CPP被调用my-tmp-dir/foo.input-pp形式的文件,该名称最终嵌入到行标记中。我喜欢能够欺骗事物,以便CPP发出original/path/foo.original.input形式的行标记。

CPP是否有任何命令标志可以让我这样做?

1 个答案:

答案 0 :(得分:3)

我不知道有什么选择,但您不能使用简单的sed -e '/^#/s,my-tmp-dir\(.*\)-pp,original/path\1,' 命令来更改行标记吗?

#line 1 "original/path/foo.original.input"

或者,将一个line指令作为转换源的第一行,以便cpp知道文件名是什么:

#line 1 "bar.c"
int test1;
#include <sys/syscall.h>
int test2;

行指令按预期工作。这个档案:

# 1 "foo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "foo.c"
# 1 "bar.c"
int test1;
# 1 "/usr/include/sys/syscall.h" 1 3 4
# 3 "bar.c" 2
int test2;

被预处理为:

foo.c

bar.c的提及仍然存在,但会被features立即覆盖。