0 加一个指针是什么意思?

ska*_*t76 20 c perl xs

我在 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 值来使只读。

  • [链接](https://github.com/Perl/perl5/commit/c43ae56ff9cdb8e0fb3d1724f564378b031a4d49)。原来这是我的承诺之一! (22认同)
  • @ skankhunt76,是的,但这会分配由`0+x` 指向* 的数据,而`0+x` 本身是*不可分配的。 (4认同)
  • 将“0+”添加到宏的提交明确声明它将强制宏为仅右值(同时添加 GvGP+set() 宏)。 (4认同)
  • 这可能被认为是不公平的优势;-) (3认同)

Lew*_*sey 11

它使它成为一个右值,即你不能这样做&(0+(gv)->sv_u.svu_gp);此外,如果它是一个数组,即0+"string",它也会将数组从 a 衰减为 a char *-char [7]所以本质上是std::decay