覆盖 CPP 输出中的行标记文件名
Posted
技术标签:
【中文标题】覆盖 CPP 输出中的行标记文件名【英文标题】:Overriding line marker filename in CPP output 【发布时间】:2016-01-20 10:19:30 【问题描述】:在工作中,我们使用 GNU CPP 作为自定义语言的预处理器。预处理器下游的流理解行标记(# 123 foo-bar.extension
形式)并将其信息嵌入到最终编译的源代码中。
这一切都很好,但整个过程通过将所有内容写入临时目录并在将输入交给 CPP 之前对输入进行一些(预)预处理。此转换不会更改行号。因此,CPP 会在 my-tmp-dir/foo.input-pp
形式的文件上被调用,并且该名称最终嵌入在行标记中。我希望能够欺骗一些东西,以便 CPP 发出 original/path/foo.original.input
形式的行标记。
CPP 是否有任何命令标志可以让我这样做?
【问题讨论】:
您能否举一个非常基本的输入示例、预期输出、您为获得此预期输出所做的工作以及实际得到的结果? 写一个名为foo.c
的空文件并用gcc -E foo.c
对其进行预处理。您会看到提到foo.c
的行标记。我想告诉 CPP,这些实际上应该是 bar.c
【参考方案1】:
我不知道有什么选项,但你不能使用简单的sed
命令来更改行标记吗?
sed -e '/^#/s,my-tmp-dir\(.*\)-pp,original/path\1,'
或者,将 line 指令作为转换后的源代码的第一行,以便 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
覆盖。
【讨论】:
sed 选项会起作用,但我希望能够直接发出正确的行。我尝试编写自己的线标记,但这似乎是通过(好)复制而没有更改 CPP 的内部线跟踪(不太好),所以它会立即被一个新的线标记纠正...... @RupertSwarbrickatBroadcom 哈?这听起来像一个错误。在我的本地 C 编译器上,行指令在预处理器插入行标记之后保留。 @RupertSwarbrickatBroadcom 你确定这正在发生吗?请记住,您需要插入一个 line 指令, 而不是我给出的答案中看到的 line marker。 @RupertSwarbrickatBroadcom 我在答案中添加了一个 line 指令如何影响预处理器输出的示例。你能确认你的不一样吗? 你是完全正确的,我添加的是行标记而不是指令。对不起!非常感谢您的帮助。以上是关于覆盖 CPP 输出中的行标记文件名的主要内容,如果未能解决你的问题,请参考以下文章
.cpp 文件中的虚拟 C++ 方法实现是不是应标记为虚拟?