我有一个代码生成器,它将获取一些用户编写的代码,并将其中的一部分嵌入到一个更大的生成文件中。当用户的代码中存在缺陷时,我希望底层编译器能够提供良好的诊断,但我也不希望生成的代码中的缺陷被错误地归因于源代码,而这些缺陷本不应该归因于源代码。
我打算在用户编写的每个代码块的开头发出#line lineNum "sourceFile"指令。但是,我找不到任何关于#line指令的文档,其中提到了一种技术,可以在我离开用户提供的代码后,将__LINE__和__FILE__“重置”回生成的文件中的实际行。理想的解决方案应该类似于C#预处理器的#line default指令。
我只需要跟踪我写了多少行,然后自己手动重置吗?或者有没有更好的方法,某种重置指令或标记值,我可以传递给#line,以消除与用户代码的关联?
这看起来可能是posed before,尽管没有可靠的答案。为了区别这一点,我还想问一下,在C++11中是否改变了答案的缺失。
发布于 2013-02-12 10:25:09
我以前使用过的一种技术是,当我的代码生成器想要重置#指令时,让它自己在一行上输出一个行,然后使用一个简单的awk脚本对文件进行后处理,并将其更改为正确的行指令:
#!/bin/awk -f
/^#$/ { printf "#line %d \"%s\"\n", NR+1, FILENAME; next; }
{ print; }发布于 2013-02-12 09:54:50
是的,您需要跟踪输出的行数,并且需要知道要输出到的文件的名称。请记住,您指定的行号是下一行的行号。因此,如果您到目前为止已经编写了12行,则需要输出#line 14 "filename",因为#line指令将位于第13行,因此下一行是14。
C和C++中的#line预处理器指令没有区别。
发布于 2013-02-12 09:56:18
假设代码生成器的输入"user.code“包含以下内容:
int foo () {
return error1 ();
}
int bar () {
return error2 ();
}假设你想要增加它,使它看起来像这样:
int foo () {
return error1 ();
}
int generated_foo () {
return generated_error1 ();
}
int bar () {
return error2 ();
}
int generated_bar () {
return generated_error2 ();
}除非你不想那样。您希望将#line指令添加到生成的代码中,以便编译器消息指明错误/警告是来自用户代码还是来自自动生成的代码。#line指令指示下一行代码的源代码(而不是包含#line指令的那一行)。
#line 1 "user.code"
int foo () {
return error1 ();
}
#line 7 "generated_code.cpp" // NOTE: This is line #6 of generated_code.cpp
int generated_foo () {
return generated_error1 ();
}
#line 5 "user.code"
int bar () {
return error2 ();
}
#line 17 "generated_code.cpp" // NOTE: This is line #16 of generated_code.cpp
int generated_bar () {
return generated_error2 ();
}https://stackoverflow.com/questions/14823996
复制相似问题