Domanda

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

È stato utile?

Soluzione

Se la variabile dell'ambito del file non è statica, è possibile 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 viene dichiarata con static, non vedo un modo per fare riferimento ad essa.

Altri suggerimenti

Non c'è :: in c ma puoi usare una funzione getter

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

   printf("%d, %d", L, getL());
}

Se parli di shadow var globale, quindi (su Linux) puoi usare 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 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 protetta in C , sono possibili risposte diverse.

Se intendi una variabile globale definita in un altro file sorgente o in una libreria collegata, devi dichiararla nuovamente 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'è modo incorporato per farlo in C. Quindi non devi farlo o per aggirare il problema. Le possibili soluzioni sono:

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

  • alias su globali 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 */
    }
    

che cos'è una "variabile globale protetta" " in puro C?

in C hai variabili locali, file variabili locali / globali (statiche) e variabili globali (esterne)

so file1.c:
int bla;

file2.c
extern int bla;

Ancora un'altra opzione è fare riferimento al globale prima di definire il proprio locale, o almeno ottenere prima un puntatore ad esso in modo da poterlo accedere dopo aver definito il proprio locale.

#include <stdio.h>

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 in essa e non usarla all'interno di d main (). l'uso del puntatore per fare riferimento alla variabile globale non sarà un problema anche se all'interno di main () è presente una variabile locale con lo stesso nome.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top