Encontré la siguiente macro en el código fuente de Perl:
#define GvGP(gv) (0+(gv)->sv_u.svu_gp) Donde sv_u.svu_gp se declara como GP* svu_gp en una unión sv_u .
No puedo encontrar ninguna definición de GP . Sin embargo, estoy más confundido acerca de lo que significa 0 más un puntero. ¿Alguien podría iluminarme por favor?
Supongo que se usa para convertirlo en un valor R, lo que lo hace de solo lectura en la práctica.
Ejemplo: se puede escribir
x = 1;pero esto no funcionará:
0+x = 1;Editar
Gracias a Dave Mitchell por señalar una confirmación relacionada en el repositorio de PERL.
agregue las macros GvCV_set() y GvGP_set().
y haga que GvCV() y GvGP() solo sean valores. ...
@@ -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) De hecho, el propósito era hacer que GvGP fuera de solo lectura creando un valor r.
Lo convierte en un rvalue, es decir, no puede hacer &(0+(gv)->sv_u.svu_gp) ; además, si fuera una matriz, es decir, 0+"string" , también decaería la matriz a un char * de un char [7] , por lo que esencialmente std::decay .