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

标签 c++ c c-preprocessor

我有一个代码生成器,它将获取一些用户编写的代码并将其 block 嵌入到一个更大的生成文件中。我希望底层编译器在用户代码中存在缺陷时提供良好的诊断,但我也不希望生成的代码中的缺陷在不应该的情况下被错误归因于源代码。

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

我是否只需要跟踪我写了多少行并自己手动重置?或者是否有更好的方法,我可以将某种重置指令或标记值传递给 #line 以消除与用户代码的关联?

看起来这可能是 posed before ,尽管那里没有可靠的答案。为了区分这个和那个,我会另外询问 C++11 是否改变了缺少答案的问题。

最佳答案

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

#!/bin/awk -f
/^#$/ { printf "#line %d \"%s\"\n", NR+1, FILENAME; next; }
{ print; }

关于c++ - 重置 C/C++ 预处理器 #line 物理文件/行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14823996/

相关文章:

c - C中获取换行的隐藏字符

c - 制作模拟 UNIX shell

c - #if 将 undefined symbol 常量假定为 0 是标准的吗?

c++ - 编译 Chrono_io 时的预处理器错误

c++ - 编译后的程序是否可能不包含实例化的模板类?

c++ - OpenGL - 使用变换矩阵确定平面上的投影

c++ - 将 (size_t)-1 传递给 snprintf_s

c++ - 如何在 C++ 中打印出嵌套 vector 的内容?

c编程部门没有按预期表现

c++ - 使用预处理器定义函数调用的缺点是什么?