我在 Perl 的源代码中发现了以下宏:
#define GvGP(gv) (0+(gv)->sv_u.svu_gp)
Run Code Online (Sandbox Code Playgroud)
其中sv_u.svu_gp声明为:
GP* svu_gp
Run Code Online (Sandbox Code Playgroud)
在一个工会sv_u。
我找不到任何定义GP。但是,我对 0 加指针的含义更加困惑。请问有人可以赐教吗?
tst*_*isl 43
我想它是用来使它成为 R 值的,这在实践中使它成为只读的。
例子:一个人可以写
x = 1;
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
0+x = 1;
Run Code Online (Sandbox Code Playgroud)
编辑
感谢 Dave Mitchell在 PERL 存储库中指出相关提交。
添加 GvCV_set() 和 GvGP_set() 宏。
并使 GvCV() 和 GvGP() 仅右值。...
@@ -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)
Run Code Online (Sandbox Code Playgroud)
事实上,目的是GvGP通过创建一个 r 值来使只读。
Lew*_*sey 11
它使它成为一个右值,即你不能这样做&(0+(gv)->sv_u.svu_gp);此外,如果它是一个数组,即0+"string",它也会将数组从 a 衰减为 a char *-char [7]所以本质上是std::decay。
| 归档时间: |
|
| 查看次数: |
1675 次 |
| 最近记录: |