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

发布于 2024-12-21 00:24:54 字数 217 浏览 2 评论 0原文

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

谢谢。

I am working with Perl embedded in our application. We have installed quite a few C++ functions that are called from within Perl. One of them is a logging function. I would like to add the file name and line number of the Perl file that called this function to the log message.
I know on the Perl side I can use the "caller()" function to get this information, but this function is already used in hundreds of locations, so I would prefer to modify the C++ side, is this information passed to the C++ XSUB functions and if so how would I get at it?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我的黑色迷你裙 2024-12-28 00:24:54

这应该有效:

char *file;
I32 line;

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

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

— 警察.h

This should work:

char *file;
I32 line;

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

Control ops (cops) are one of the two ops OP_NEXTSTATE and op_DBSTATE,
that (loosely speaking) are separate statements.
They hold information important for lexical state and error reporting.
At run time, PL_curcop is set to point to the most recently executed cop,
and thus can be used to determine our current state.

— cop.h

羁绊已千年 2024-12-28 00:24:54

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

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

sub logger { _real_logger(caller, @_) }

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

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

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

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

Can't you call perl builtins from XS? I confess I don't know.

If not, you could always do something like this:

sub logger { _real_logger(caller, @_) }

assuming logger is what your function is called (and you rename your C++ XS function to _real_logger. You could also do this, presumably, if you need to hide yourself in the call tree:

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

which is of course the normal form of goto used in AUTOLOAD.

These will add overhead, of course, but probably not a big deal for a logging function.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文