Я занимаюсь некоторыми исследованиями, связанными с совместимостью с 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 */
против
#define GvCV(gv) (0+GvGP(gv)->gp_cv) /* in Perl 5.14 */
Удаление этого 0+
из определения позволяет скомпилировать mod_perl 2.0.4, и это прекрасно, потому что 0+...
не распознается как lvalue по сравнению с предыдущими версиями.
Почему 0+
используется в определении GvCV и нужно ли это? или безопасно удалить его и иметь определение GvCV(gv)
, как в предыдущих версиях Perl?