在工作中,我们使用GNU CPP作为自定义语言的预处理器。预处理器下游的流程理解行标记(格式为# 123 foo-bar.extension
)并将其信息嵌入到最终编译源中。
这一切都很好,但是整个过程的工作原理是将所有内容写入临时目录,并在将输入传递给CPP之前对输入进行一些(预)处理。此转换不会更改行号。结果,CPP被调用my-tmp-dir/foo.input-pp
形式的文件,该名称最终嵌入到行标记中。我喜欢能够欺骗事物,以便CPP发出original/path/foo.original.input
形式的行标记。
CPP是否有任何命令标志可以让我这样做?
答案 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
立即覆盖。