我在Perl的源代碼中發現了下面這個宏:
#define GvGP(gv) (0 (gv)-> sv_u.svu_gp)
其中sv_u.svu_gp被宣告為:
GP* svu_gp
在一個聯盟sv_u中。
我找不到任何關于GP的定義。然而,我更困惑的是,0加一個指標意味著什么。誰能給我指點一下嗎?
uj5u.com熱心網友回復:
我猜它是用來使它成為一個R值的,什么使它在實踐中成為只讀的。 在實踐中,它是只讀的。
例如,它是用來使它成為一個R值的,什么使它成為只讀的?
舉個例子。 人們可以寫
x = 1;
但這并不可行:
0 x = 1;
編輯
感謝Dave Mitchell在PERL資源庫中指出一個相關的commit。
添加 GvCV_set() 和 GvGP_set() 宏。并使GvCV()和GvGP()只具有R值。 ...
@@ 52, 7 57,8 @@ struct gp {
# define GvNAME_get(gv) ({ assert(GvNAME_HEK(gv)); (char *)HEK_KEY(GvNAME_HEK(gv)); })
# define GvNAMELEN_get(gv) ({ assert(GvNAME_HEK(gv)) ; HEK_LEN(GvNAME_HEK(gv)); })
#else
-# define GvGP(gv) ((gv)-> sv_u.svu_gp)
# define GvGP(gv) (0 (gv)-> sv_u.svu_gp)
# define GvGP_set(gv,gp) ((gv)->sv_u.svu_gp = (gp))
# define GvFLAGS(gv) (GvXPVGV(gv)-> xpv_cur)
# define GvSTASH(gv) (GvXPVGV(gv)->xnv_u.xgv_stash)
# define GvNAME_HEK(gv) (GvXPVGV(gv)-> xiv_u.xivu_namehek)
的確,目的是通過制作一個r值來使GvGP成為只讀。
uj5u.com熱心網友回復:
它使它成為一個r值,即你不能做&(0 (gv)->sv_u.svu_gp);此外,如果它是一個陣列,即0 "string",它也將從一個char[7]衰減到一個char *--所以本質上std::decay。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311333.html
標籤:
上一篇:使用$_的Perl多階grep
下一篇:Perl-撤銷查找變數-為什么?
