Come posso accedere a una variabile globale ombreggiata in C?

Come posso accedere a una variabile globale ombreggiata in C? In C ++ posso usare :: per lo spazio dei nomi globale.

Se la variabile del file scope non è statica, è ansible utilizzare una dichiarazione che utilizza extern in un ambito nidificato:

 int c; int main() { { int c = 0; // now, c shadows ::c. just re-declare ::c in a // nested scope: { extern int c; c = 1; } // outputs 0 printf("%d\n", c); } // outputs 1 printf("%d\n", c); return 0; } 

Se la variabile è dichiarata con static, non vedo un modo per farvi riferimento.

Non c’è :: in c ma è ansible utilizzare una funzione getter

 #include  int L=3; inline int getL() { return L; } int main(); { int L = 5; printf("%d, %d", L, getL()); } 

Se si sta parlando di ombreggiato globale var, quindi (su Linux) è ansible utilizzare dlsym() per trovare un indirizzo della variabile globale, come questo:

 int myvar = 5; // global { int myvar = 6; // local var shadows global int *pglob_myvar = (int *)dlsym(RTLD_NEXT, "myvar"); printf("Local: %d, global: %d\n", myvar, *pglob_myvar); } 

Se vuoi che il tuo codice sia sexy, usa la macro:

 #define GLOBAL_ADDR(a,b) b =(typeof(b))dlsym(RTLD_NEXT, #a) ... int *pglob_myvar; GLOBAL_ADDR(myvar, pglob_myvar); ... 

A seconda di ciò che chiamate variabile globale schermata in C , sono possibili risposte diverse.

Se intendi una variabile globale definita in un altro file sorgente o in una libreria collegata, devi solo dichiararla di nuovo con il prefisso extern :

 extern int aGlobalDefinedElsewhere; 

Se intendi una variabile globale ombreggiata (o eclissata, scegli la terminologia che preferisci) con una variabile locale con lo stesso nome), non c’è un modo incorporato per farlo in C. Quindi non devi farlo o lavorare in giro esso. Le possibili soluzioni sono:

  • funzioni getter / setter per l’accesso alla variabile globale (che è una buona pratica, in particolare nelle situazioni multithread)

  • alias a globals tramite un puntatore definito prima della variabile locale:

     int noName; { int * aliasToNoName = &noName; /* reference to global */ int noName; /* declaration of local */ *aliasToNoName = noName; /* assign local to global */ } 

cos’è una “variabile globale schermata” in puro C?

in C si hanno variabili locali, file variabili locali / globali (statiche) e variabili globali (extern)

 so file1.c: int bla; file2.c extern int bla; 

Un’altra opzione è quella di fare riferimento al globale prima di definire il tuo locale, o almeno di ottenere prima un puntatore per poterlo accedere dopo aver definito il tuo locale.

 #include  int x = 1234; int main() { printf("%d\n",x); // prints global int x = 456; printf("%d\n",x); // prints local } 

gyz y 2 pensa così tanto Basta usare la variabile pointer n per memorizzare l’indirizzo della variabile globale e usarlo dentro d main (). usare il puntatore per riferirsi alla variabile globale non sarà un problema anche se una variabile locale con lo stesso nome è presente all’interno di main ().