Accedere a una variabile statica globale da un altro file in C
-
21-09-2019 - |
Domanda
Nel linguaggio C, voglio accedere a una variabile statica globale al di fuori del campo di applicazione del file. Fatemi sapere il modo migliore per farlo. Uno dei metodi è per assegnare una variabile globale extern il valore della variabile statica,
Nel file di a.c
static int val = 10;
globalvar = val;
Nel file di a.C.
extern globalvar;
Ma in questo caso non verranno aggiornati tutti i cambiamenti in val (file a.c) in globalvar a (a.C. file).
Per favore fatemi sapere come posso ottenere lo stesso.
Grazie, Sikandar.
Soluzione
Bene, se è possibile modificare il file a.c
poi basta fare val
non statici.
Se è possibile modificare a.c
, ma non può fare val
non statico (perché?), Allora si può solo dichiarare un puntatore globale in a.c
int *pval = &val;
e in b.c
fare
extern int *pval;
che vi permetterà di accedere al valore corrente di val
attraverso *pval
. Oppure si può introdurre una funzione non statica che restituirà il valore corrente di val
.
Ma ancora una volta, se avete bisogno di accedervi da altre unità di traduzione, basta renderlo non-statico.
Altri suggerimenti
È possibile effettuare il puntatore variabile globale alla variabile statica 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;
}
In esecuzione:
$ gcc *.c && ./a.out
100
Non è possibile accedere a una variabile statica a livello di file al di fuori del file.
Se veramente bisogno di farlo, si dispone di un paio di scelte.
-
Aggiungi una funzione di accesso al file che ha la variabile statica. La cosa bella è questo limita l'accesso dall'esterno del file da sola lettura:
int read_static () {return val; }
-
Eliminare la qualificazione statica e rendere la variabile a livello globale.
Soluzione 1:
Nel file di a.c
static int val=10;
int *globalvar =&val;
Nel file di a.C.
extern int *globalvar;
Soluzione 2:
Invece di avere un'altra variabile per passare l'indirizzo della variabile statica aggiungendo così poca memoria byte sprechi, rendere variabile statica stessa come extern.
Soluzione 2 è raccomandato, ma nel caso in cui, se si sono limitati a cambiare la variabile statica per esterno, soluzione Uso 1.