Почему Perl 5.14 использует определение (0+GvGP(gv)->gp_cv) для GvGC?

Я занимаюсь исследованием совместимости mod_perl-Apache-Perl. Недавно я попытался собрать mod_perl 2.0.4, используя Perl 5.14.2. Фаза компиляции была преждевременно прервана с ошибкой:

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+... не распознается как lvalueпо сравнению с предыдущими версиями.

Почему в определении GvCV используется 0+и нужно ли это? или безопасно удалить его и получить определение GvCV(gv), как в предыдущих версиях Perl?

12
задан ArtM 13 May 2012 в 10:26
поделиться