programing

'0+ptr'(0 + 포인터)은 무엇을 의미합니까?

powerit 2023. 7. 27. 22:26
반응형

'0+ptr'(0 + 포인터)은 무엇을 의미합니까?

Perl의 소스 코드에서 다음 매크로를 찾았습니다.

#define GvGP(gv) (0+(gv)->sv_u.svu_gp)

어디에sv_u.svu_gp로 선언됩니다.GP* svu_gp단결하여sv_u.

에 대한 정의를 찾을 수 없습니다.GP하지만 저는 0 더하기 포인터가 무엇을 의미하는지 더 혼란스럽습니다.누구 좀 가르쳐 주시겠어요?

R 값으로 만들기 위해 사용되는 것 같은데, 실제로는 읽기 전용으로 만드는 이유는 무엇입니까?

예:글을 쓸 수 있습니다.

x = 1;

하지만 이것은 작동하지 않을 것입니다.

0+x = 1;

편집

PERL 저장소에서 관련 커밋을 알려준 Dave Mitchell에게 감사드립니다.

GvCV_set() 및 GvGP_set() 매크로를 추가합니다.

GvCV() 및 GvGP() rvalue-only로 설정...

@@ -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)

정말로, 목적은 만드는 것이었습니다.GvGPr 값을 만들어 읽기 전용입니다.

그것은 그것을 rvalue로 만든다, 즉 당신은 할 수 없습니다.&(0+(gv)->sv_u.svu_gp)게다가, 만약 그것이 대신 배열이었다면, 즉.0+"string"그것은 또한 배열을 부식시킬 것입니다.char *a부터char [7]본질적으로std::decay.

언급URL : https://stackoverflow.com/questions/69040993/what-does-0ptr-0-plus-a-pointer-mean

반응형