为什么Perl 5.14使用(0 + GvGP(gv) - > gp_cv)定义GvGC?

时间:2012-05-12 13:05:03

标签: c perl mod-perl

我正在做一些与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 */

VS

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

从定义中删除此0+可以成功编译mod_perl 2.0.4,这很好,因为与先前版本相比,0+...无法识别为左值

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

1 个答案:

答案 0 :(得分:12)

推动此更改的提交是this one

短日志:

  

添加GvCV_set()和GvGP_set()宏。

     

并使GvCV()和GvGP()仅限rvalue

     

这允许将来提交消除一些反射魔法   GV和CV,需要完全控制分配给   gp_cv slot。

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

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