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.

È stato utile?

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.

  1. 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; }

  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top