我正在使用嵌入在我们的应用程序中的Perl。我们安装了很多从Perl中调用的C ++函数。其中之一是记录功能。我想将调用此函数的Perl文件的文件名和行号添加到日志消息中 我知道在Perl方面我可以使用“caller()”函数来获取这些信息,但是这个函数已经在数百个位置使用了,所以我宁愿修改C ++方面,这个信息是否传递给了C ++ XSUB功能,如果是这样,我将如何得到它?
感谢。
答案 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的正常形式。
当然,这会增加开销,但对于日志记录功能来说可能不是什么大问题。