Tôi đang thực hiện một số nghiên cứu liên quan đến khả năng tương thích mod_perl-Apache-Perl. Gần đây tôi đã cố gắng xây dựng mod_perl 2.0.4 bằng Perl 5.14.2. Giai đoạn biên soạn đã được chấm dứt sớm với một lỗi:Tại sao Perl 5.14 sử dụng định nghĩa (0 + GvGP (gv) -> gp_cv) cho GvGC?
modperl_perl.c: In function ‘modperl_perl_core_global_init’:
modperl_perl.c:58:9: error: lvalue required as left operand of assignment
Ở vị trí này, các mã sau đây được viết:
GvCV(gv) = get_cv(cglobals->sub_name, TRUE);
Tìm kiếm những gì có thể tạo ra lỗi này, tôi đã tìm thấy một sự khác biệt giữa các phiên bản trước của Perl và 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 */
Loại bỏ 0+
này từ định nghĩa cho phép mod_perl 2.0.4 được biên dịch thành công, và điều này là tốt vì 0+...
không được công nhận như một giá trị trái so với phiên bản trước.
Tại sao là 0+
được sử dụng trong định nghĩa của GvCV và có cần thiết không? hoặc là nó an toàn để loại bỏ nó và có định nghĩa của GvCV(gv)
như trong các phiên bản trước của Perl?
+1 câu hỏi được nghiên cứu kỹ. – pilcrow