覆盖 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++ 方法实现是不是应标记为虚拟?

Linux文件操作常用选项

Apache Spark 如何保留输出文本文件中的行顺序?

●BZOJ 2329 [HNOI2011]括号修复.cpp

编写一个对txt文件中的行进行编号的函数,跳过空白行并将输出写入另一个文件

CPP 在 rpcgen 源文件的 %-lines 中扩展宏