Accédez à une variable statique globale d'un autre fichier dans C
-
21-09-2019 - |
Question
Dans le langage C, je veux accéder à une variable statique globale en dehors du champ d'application du fichier. Permettez-moi de connaître la meilleure façon possible de le faire. L'une des méthodes consiste à attribuer une variable globale extern la valeur de la variable statique,
Dans le fichier a.c
static int val = 10;
globalvar = val;
Dans le fichier b.c
extern globalvar;
Mais dans ce cas, toute modification val (fichier a.c) ne seront pas mis à jour dans globalvar (fichier av. J.-C.).
S'il vous plaît laissez-moi savoir comment puis-je obtenir le même.
Merci, Sikandar.
La solution
Eh bien, si vous pouvez modifier a.c
de fichier, puis juste faire val
non statique.
Si vous pouvez modifier a.c
mais ne peut pas faire non statique val
(pourquoi?), Alors vous pouvez simplement déclarer un pointeur global pour en a.c
int *pval = &val;
et b.c
faire
extern int *pval;
qui vous permettra d'accéder à la valeur actuelle de val
par *pval
. Ou vous pouvez introduire une fonction non statique qui retourne la valeur actuelle de val
.
Mais encore une fois, si vous avez besoin d'y accéder à partir d'autres unités de traduction, tout simplement le rendre non-statique.
Autres conseils
Vous pouvez faire le pointeur variable globale à la variable statique globale.
/* 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 cours d'exécution:
$ gcc *.c && ./a.out
100
Vous ne pouvez pas accéder à l'extérieur du fichier un niveau de fichier variable statique.
Si vous avez vraiment besoin de le faire, vous avez deux choix.
-
Ajouter une fonction accesseur dans le fichier qui a la variable statique. La bonne chose est ce qui limite l'accès à l'extérieur du fichier d'accès en lecture seule:
int read_static () {return val; }
-
Laissez tomber le qualificatif statique et faire la variable globale un.
Solution 1:
Dans le fichier a.c
static int val=10;
int *globalvar =&val;
Dans le fichier b.c
extern int *globalvar;
Solution 2:
Au lieu d'avoir une autre variable à passer l'adresse de la variable statique ajoutant ainsi peu de mémoire octets gaspillage, rendre la variable statique elle-même comme extern.
Solution 2 est recommandée, mais dans le cas si vous êtes limité à changer la variable statique extern, solution d'utilisation 1.