覆盖 CPP 输出中的行标记文件名

Overriding line marker filename in CPP output

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

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

形式的行标记

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

我不知道有什么选择,但是你不能使用简单的 sed 命令来更改线标记吗?

sed -e '/^#/s,my-tmp-dir\(.*\)-pp,original/path,'

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

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

行指令按预期工作。此文件:

#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 覆盖。