variable son que locales las inicializar globales externas estaticas como alcance c scope global-variables

son - ¿Cómo puedo acceder a una variable global sombreada en C?



variables globales y locales c (7)

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


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

en C tiene variables locales, variables locales / globales de archivos (estáticas) y variables globales (externas)

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


Dependiendo de lo que usted llame la variable global blindada en C , las diferentes respuestas son posibles.

Si se refiere a una variable global definida en otro archivo fuente o una biblioteca vinculada, solo tiene que declararla nuevamente con el prefijo extern :

extern int aGlobalDefinedElsewhere;

Si se refiere a una variable global sombreada (o eclipsada, elija la terminología que prefiera) por una variable local del mismo nombre), no hay una forma integrada de hacerlo en C. Entonces, tiene que o no hacerlo o trabajar alrededor eso. Las posibles soluciones son:

  • funciones getter / setter para acceder a la variable global (que es una buena práctica, en particular en situaciones 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 */ }


No hay :: en c pero puede usar una función getter

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


Otra opción es hacer referencia al global antes de definir tu local, o al menos obtener un puntero primero para que puedas acceder a él luego de definir tu local.

#include <stdio.h> int x = 1234; int main() { printf("%d/n",x); // prints global int x = 456; printf("%d/n",x); // prints local }


Si está hablando de var global oculto, 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); ...


Si la variable del alcance del archivo no es estática, puede usar una declaración que use extern en un ámbito 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 forma de referirme a ella.


gyz y 2 think more Just use pointer variable n store la dirección de la variable global en ella n den use it inside d main (). usar el puntero para referir la variable global no será un problema incluso si hay una variable local con el mismo nombre dentro de main ().