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 ().