gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:41:12 24 4
gpt4 key购买 nike

我正在做一些与 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+... 未被识别为 < em>lvalue 与以前的版本相比。

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

最佳答案

插入此更改的提交是 this one .

短日志:

add GvCV_set() and GvGP_set() macros.

and make GvCV() and GvGP() rvalue-only.

This it to allow a future commit to eliminate some backref magic betweenGV and CVs, which will require complete control over assignment to thegp_cv slot.

所以 0+ 的目的正是让这些宏成为右值。您最好等待 mod_perl 更新其代码以匹配新的语义,因为恢复这些宏在某些时候是无效的。 (我不知道那个“future commit”是否已经实现了。)

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

关于c - 为什么 Perl 5.14 使用 (0+GvGP(gv)->gp_cv) 定义 GvGC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10564006/

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