Pregunta

¿Cómo puedo acceder a una variable global sombreada en C? En C ++ puedo usar :: para el espacio de nombres global.

¿Fue útil?

Solución

Si su variable de alcance de archivo no es estática, entonces puede usar una declaración que use extern en un alcance anidado:

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;
}

Si la variable se declara con estática, no veo una manera de referirme a ella.

Otros consejos

No hay :: in c, pero puedes usar una función de obtención

#include <stdio.h>

int L=3;

inline int getL()
{
   return L;
}

int main();
{
   int L = 5;

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

Si está hablando de una var. global sombreada, entonces (en Linux) puede usar dlsym () para encontrar una dirección de la variable global, como esta:

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);
}

Si quieres que tu código se vea sexy, usa macro:

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

Dependiendo de lo que llames variable global protegida en C , son posibles diferentes respuestas.

Si te refieres a una variable global definida en otro archivo fuente o una biblioteca vinculada, solo tienes que declararla nuevamente con el prefijo extern :

extern int aGlobalDefinedElsewhere;

Si te refieres a una variable global sombreada (o eclipsada, elige la terminología que prefieras) por una variable local del mismo nombre), no hay una forma integrada de hacerlo en C. Así que tienes que no hacerlo o para trabajar a su alrededor. Las posibles soluciones son:

  • funciones getter / setter para acceder a la variable global (lo que es una buena práctica, en particular en situaciones de multiproceso)

  • alias a globales mediante un puntero definido antes de la variable local:

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

¿Qué es una " variable global blindada " en puro C?

en C tienes variables locales, variables locales / globales de archivo (estáticas) y variables globales (externas)

so file1.c:
int bla;

file2.c
extern int bla;

Otra opción es hacer referencia al global antes de definir su local, o al menos obtener un puntero a él primero para que pueda acceder a él después de definir su local.

#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 piensan mucho Simplemente use la variable de puntero n y almacene la dirección de la variable global en n n usen dentro de d main (). usar el puntero para referir la variable global no será un problema, incluso si una variable local con el mismo nombre está dentro de main ()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top