从C ++中确定perl文件的行号和文件名

时间:2011-12-12 23:26:42

标签: c++ perl xs

我正在使用嵌入在我们的应用程序中的Perl。我们安装了很多从Perl中调用的C ++函数。其中之一是记录功能。我想将调用此函数的Perl文件的文件名和行号添加到日志消息中 我知道在Perl方面我可以使用“caller()”函数来获取这些信息,但是这个函数已经在数百个位置使用了,所以我宁愿修改C ++方面,这个信息是否传递给了C ++ XSUB功能,如果是这样,我将如何得到它?

感谢。

2 个答案:

答案 0 :(得分:2)

这应该有效:

char *file;
I32 line;

file = OutCopFILE(PL_curcop);
line = CopLINE(PL_curcop);
  

控制操作(警察)是两个操作OP_NEXTSTATE和op_DBSTATE之一,   (松散地说)是单独的陈述。   它们包含对词汇状态和错误报告很重要的信息。   在运行时,PL_curcop设置为指向最近执行的警察,   因此可以用来确定我们当前的状态。

- cop.h

答案 1 :(得分:1)

你不能从XS调用perl builtins吗?我承认我不知道。

如果没有,你总是可以这样做:

sub logger { _real_logger(caller, @_) }

假设logger是您的函数被调用的(并且您将C ++ XS函数重命名为_real_logger。如果您需要隐藏自己在调用树中,也可以这样做:< / p>

sub logger {
    unshift @_, caller;
    goto &_real_logger;
}

当然是AUTOLOAD中使用的goto的正常形式。

当然,这会增加开销,但对于日志记录功能来说可能不是什么大问题。