4

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

谢谢。

4

2 回答 2

2

这应该有效:

char *file;
I32 line;

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

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

— 警察.h

于 2011-12-12T23:59:52.410 回答
1

你不能从 XS 调用 perl 内置函数吗?我承认我不知道。

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

sub logger { _real_logger(caller, @_) }

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

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

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

当然,这些会增加开销,但对于日志功能来说可能没什么大不了的。

于 2011-12-12T23:31:36.460 回答