12

我正在做一些与 mod_perl-Apache-Perl 兼容性相关的研究。最近我尝试使用 Perl 5.14.2 构建 mod_perl 2.0.4。编译阶段因错误而提前终止:

modperl_perl.c: In function ‘modperl_perl_core_global_init’:
modperl_perl.c:58:9: error: lvalue required as left operand of assignment

在这个地方编写了以下代码:

    GvCV(gv) = get_cv(cglobals->sub_name, TRUE);

搜索可能产生此错误的原因,我发现 Perl 和 Perl 5.14 (CORE/gv.h) 的早期版本之间存在差异:

    #define GvCV(gv) (GvGP(gv)->gp_cv)   /* previous versions */

对比

    #define GvCV(gv) (0+GvGP(gv)->gp_cv)  /* in Perl 5.14 */

从定义中删除它0+允许 mod_perl 2.0.4 成功编译,这很好,因为与以前的版本相比, 0+...它不被识别为左值。

为什么0+在 GvCV 的定义中使用,是否有必要?或者删除它并GvCV(gv)在以前的 Perl 版本中定义 like 是否安全?

4

1 回答 1

13

推动此更改的提交是this

短日志:

添加 GvCV_set() 和 GvGP_set() 宏。

并制作 GvCV() 和 GvGP() rvalue-only

这是为了允许未来的提交消除 GV 和 CV 之间的一些反向引用魔法,这将需要完全控制分配给 gp_cv 插槽。

因此,这样做的目的0+正是使这些宏成为 rvalues。您最好等待mod_perl更新其代码以匹配新语义,因为在某些时候还原这些宏将是无效的。(我不知道“未来的提交”是否已经实现。)

相关讨论:http ://www.nntp.perl.org/group/perl.perl5.porters/2011/01/msg167682.html

于 2012-05-12T13:15:44.133 回答