gpt4 book ai didi

perl - 在 C++ (Win32) 中嵌入 Perl 时检查 ERRSV 时崩溃

转载 作者:行者123 更新时间:2023-12-05 00:56:34 26 4
gpt4 key购买 nike

我将 Perl 解释器 (v 5.16.3) 嵌入到我基于 Visual C++ 的代码中(在 Windows 7 上)。目的是从我的 C++ 程序调用 Perl 中用户编写的子例程。

调用Perl的C++代码的整体结构如下:

perl_alloc()
perl_construct()
perl_parse()

dSP

int result = call_argv(funcName, G_ARRAY|G_EVAL|G_KEEPERR, params);

if (SvTRUE (ERRSV)) // <-- crashes here
{
:
}

此代码在运行时在标记行上崩溃。问题源于访问 ERRSV,这将是一个宏。做了一些故障排除,我发现麻烦制造者是以下属性:

vTHX->Ierrgv

即,在我的例子中,Ierrgv 为 NULL。

如果我注释掉这个错误检查(即 SvTRUE),代码本身可以正常工作,而且我知道我的 Perl 脚本也会被执行。我什至可以从被调用的子程序中检索返回参数!

有人能告诉我为什么 Ierrgv 会是 NULL,这到底是什么意思?

编辑:

做一个小改动显然可以解决问题,但由于没有详细了解 Ierrgv 的用法,我没有信心将其视为解决方案:

int result = call_argv(funcName, G_ARRAY|G_EVAL|G_KEEPERR, params);

if ( (result==0) && (SvTRUE (ERRSV) ) // <-- doesn't crash here
{
:
}

result 添加的检查确保我们仅在 result 为零时评估 ERRSV。正如我之前所说,显然这解决了问题。

最佳答案

G_KEEPERR 专门防止设置 ERRSV ($@)。摆脱它。

(保持显示错误消息而不是在 $@ 中返回它。)

When G_KEEPERR is used, any error in the called code will terminate the call as usual, and the error will not propagate beyond the call (as usual for G_EVAL), but it will not go into $@. Instead the error will be converted into a warning, prefixed with the string "\t(in cleanup)". This can be disabled using no warnings 'misc'. If there is no error, $@ will not be cleared.

关于perl - 在 C++ (Win32) 中嵌入 Perl 时检查 ERRSV 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17297997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com