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

Art*_*rtM 12 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
Run Code Online (Sandbox Code Playgroud)

在这个地方写下面的代码:

    GvCV(gv) = get_cv(cglobals->sub_name, TRUE);
Run Code Online (Sandbox Code Playgroud)

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

    #define GvCV(gv) (GvGP(gv)->gp_cv)   /* previous versions */
Run Code Online (Sandbox Code Playgroud)

VS

    #define GvCV(gv) (0+GvGP(gv)->gp_cv)  /* in Perl 5.14 */
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*Mat 13

推动此更改的提交就是这个.

短日志:

添加GvCV_set()和GvGP_set()宏.

并使GvCV()和GvGP()仅为rvalue.

这允许将来的提交消除GV和CV之间的一些反射魔法,这将需要完全控制对gp_cv槽的分配.

所以这样做的目的0+正是为了使这些宏成为价值.你最好等待mod_perl更新它的代码以匹配新的语义,因为恢复thos宏在某些时候将是无效的.(我不知道"未来的提交"是否已经实施.)

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

  • 因此,添加这个"0 +"前缀是为了消除CV的任何用法*lvalues*并使开发人员使用`GvCV_set()`代替.删除这个'0 +`前缀是不安全的.我理解正确吗?关于mod_perl:它有更新的版本用Perl 5.14成功编译(只是看,`GvCV_set()`在那里使用); 2.0.4是旧的.我认为你的回答足够接近我的预期.谢谢. (2认同)