重置C/C++预处理器#line物理文件/行

Phi*_*ler 6 c c++ c-preprocessor

我有一个代码生成器,它将采用一些用户编写的代码并将其中的块嵌入更大的生成文件中.我希望底层编译器在用户代码中存在缺陷时提供良好的诊断,但我也不希望生成的代码中的缺陷在它们不应该被错误地分配给源时.

我打算#line lineNum "sourceFile"在每个用户编写的代码块的开头发出指令.但是,在我离开用户提供的代码后,我找不到任何#line指令的文档,这些文档提到了"重置"技术__LINE____FILE__返回生成文件中的实际行.理想的解决方案类似于C#预处理器的#line default指令.

我只需要跟踪我写的行数并亲自手动重置吗?或者有更好的方法,我可以传递某种重置指令或sentinel值#line来擦除与用户代码的关联?

看起来这可能是以前提出的,尽管那里没有可靠的答案.为了区别于此,我还要问一下C++ 11中是否缺少答案.

Chr*_*odd 6

我之前使用的一种技术是让我的代码生成器#在它想要重置行指令时自行输出一行,然后使用一个简单的awk脚本对文件进行后处理并将其更改为正确的行指令:

#!/bin/awk -f
/^#$/ { printf "#line %d \"%s\"\n", NR+1, FILENAME; next; }
{ print; }
Run Code Online (Sandbox Code Playgroud)