我正在使用嵌入在我们的应用程序中的 Perl。我们已经安装了很多从 Perl 中调用的 C++ 函数。其中之一是日志记录功能。我想将调用此函数的 Perl 文件的文件名和行号添加到日志消息中。
我知道在 Perl 端我可以使用“caller()”函数来获取这些信息,但是这个函数已经在数百个位置使用,所以我更愿意修改 C++ 端,是否将此信息传递给 C++ XSUB功能,如果是这样,我将如何获得它?
谢谢。
这应该有效:
char *file;
I32 line;
file = OutCopFILE(PL_curcop);
line = CopLINE(PL_curcop);
控制操作(警察)是两个操作 OP_NEXTSTATE 和 op_DBSTATE 之一,它们(松散地说)是单独的语句。它们保存对词汇状态和错误报告很重要的信息。在运行时,PL_curcop 被设置为指向最近执行的 cop,因此可用于确定我们当前的状态。
— 警察.h
你不能从 XS 调用 perl 内置函数吗?我承认我不知道。
如果没有,你总是可以做这样的事情:
sub logger { _real_logger(caller, @_) }
假设logger
是您的函数被调用的内容(并且您将 C++ XS 函数重命名为_real_logger
。如果您需要将自己隐藏在调用树中,大概也可以这样做:
sub logger {
unshift @_, caller;
goto &_real_logger;
}
这当然是 goto 中使用的正常形式AUTOLOAD
。
当然,这些会增加开销,但对于日志功能来说可能没什么大不了的。