我正在使用 Perl 模板工具包来生成 C 文件。我非常希望能够在我的 C 代码中包含 #line 指令,以便来自 C 编译器的错误消息将我发送到正确的位置(模板文件)而不是错误的位置(模板输出)。但是,我不知道该怎么做。我从 Google 得到的唯一结果是 Template Toolkit 邮件列表上的一条未答复消息。
我可以想象一个折磨人的解决方案,比如自己阅读模板文件并添加行号,但是有没有人有技巧甚至明智的方法来获取模板工具包中原始文件的行号?
我正在使用 Perl 模板工具包来生成 C 文件。我非常希望能够在我的 C 代码中包含 #line 指令,以便来自 C 编译器的错误消息将我发送到正确的位置(模板文件)而不是错误的位置(模板输出)。但是,我不知道该怎么做。我从 Google 得到的唯一结果是 Template Toolkit 邮件列表上的一条未答复消息。
我可以想象一个折磨人的解决方案,比如自己阅读模板文件并添加行号,但是有没有人有技巧甚至明智的方法来获取模板工具包中原始文件的行号?
在我看来,Template::Parser 的 location 方法返回了一个合适的 #line 指令,但我没有看到任何内置函数将其包含在输出中。您必须扩展 Template Toolkit 才能做到这一点。
看起来 Template::Toolkit 本身并不支持这一点。您可以做的一件事是让您的程序也在适当的模板中编写生成的行到它们的行的映射,以便您可以使用简单的脚本查找错误。
由于#line 指令中的数字和“文件名”完全由(无论你想要什么)组成,我建议使用稍微不同的上下文将#line 指令放入模板中。
而不是自己计算模板中的行数,您可以这样做,甚至使用模板预处理器。我会为模板的不同部分“发明”文件名,并用你可以数出的小数字为这些行编号。
然后错误消息可能会显示“... in line 2 of div id='topleft'”
蛮力解决方案:
#!/usr/local/bin/perl
use warnings;
use strict;
my $file = "something.c";
open my $input, "<", $file or die $!;
while (<$input>) {
print "#line $. \"$file\"\n";
print;
}
close $input or die $!;
更好的是,在线测试并仅在必要时[%
打印s。#line