Acceder a una variable estática global desde otro archivo en C
-
21-09-2019 - |
Pregunta
En lenguaje C, Quiero acceder a una variable estática global, al margen del archivo. Que me haga saber la mejor manera posible hacerlo. Uno de los métodos consiste en asignar una variable global extern el valor de la variable estática,
En A.C. archivo
static int val = 10;
globalvar = val;
En b.c archivo
extern globalvar;
Pero en este caso, cualquier cambio en val (A.C. archivo) no se actualizarán en globalvar en (b.c archivo).
Por favor, hágamelo saber cómo puedo conseguir el mismo.
Gracias, Sikandar.
Solución
Bueno, si se puede modificar a.c
archivo a continuación, sólo hacer val
no estático.
Si se puede modificar a.c
pero no puede hacer val
no estático (¿por qué?), Entonces puede declarar un puntero global para que en a.c
int *pval = &val;
y en b.c
hacer
extern int *pval;
que le permitirá acceder al valor actual de val
través *pval
. O se puede introducir una función no estática que devolverá el valor actual de val
.
Pero, de nuevo, si es necesario acceder a ella desde otras unidades de traducción, sólo lo hacen no estático.
Otros consejos
Se puede hacer que el puntero variable global para la variable estática global.
/* file a.c */
static int a = 100; /* global static variable not visible outside this file.*/
int *b = &a; /* global int pointer, pointing to global static*/
/* file b.c */
extern int *b; /* only declaration, b is defined in other file.*/
int main()
{
printf("%d\n",*b); /* dereferencing b will give the value of variable a in file a.c */
return 0;
}
En funcionamiento:
$ gcc *.c && ./a.out
100
No se puede acceder a un nivel de archivo variable estática fuera del archivo.
Si realmente necesita hacer eso, usted tiene un par de opciones.
-
Añadir una función de acceso al archivo que tiene la variable estática. Lo bueno es que este acceso restringe desde fuera del archivo para acceso de sólo lectura:
int read_static () {return val; }
-
La caída de la clasificación estática y hacer que la variable a.
mundial
Solución 1:
En A.C. archivo
static int val=10;
int *globalvar =&val;
En b.c archivo
extern int *globalvar;
Solución 2:
En lugar de tener otra variable para pasar la dirección de la variable estática que añade unos pocos bytes de memoria desperdicio, hacen que la variable estática como externo.
Se recomiendaSolución 2, pero en caso de que si se limita a cambiar la variable estática a extern, solución de uso 1.