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


我正在做一些与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的定义,是否有必要?或者删除它并安排定义是否安全 GvCV(gv) 像以前的Perl版本一样?


11270
2018-05-12 13:05


起源

+1研究得很好的问题。 - pilcrow


答案:


推动此更改的提交是 这个

短日志:

添加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


12
2018-05-12 13:15



所以这 0+ 添加前缀以消除任何CV的使用 左值 并让开发人员使用 GvCV_set() 代替。删除它是不安全的 0+ 字首。我是否正确理解?关于mod_perl:它有更新的版本使用Perl 5.14成功编译(只是看, GvCV_set() 在那里使用); 2.0.4是旧的。我认为你的回答足够接近我的预期。谢谢。 - ArtM
是的,那'怎么理解事情。 - Mat
@ArtM,是的,就是这样。 - ikegami