覆盖 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
覆盖。
在工作中,我们使用 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
覆盖。