PDA

Visualizza la versione completa : [C] Variabili globali static


tia86
28-09-2008, 15:57
Ho un file dove sono presenti funzioni e variabili globali dichiarate static. Questo file è incluso nel main. In teoria le variabili globali static presenti nel file non dovrebbero essere visibili, eppure le vede. Dove sto sbagliando?

main.c


#include "f1.c"

int main (void)
{
f1();
a++; // dovrebbe essere inacessibile, invece accede lo stesso
}



f1.c


static int a;

void f1 (void)
{ etc}


Grazie.
PS. Uso DEV-Cpp

MItaly
28-09-2008, 16:00
Non si includono i file .c; se includi f1.c la dichiarazione della variabile globale static risulterà locale al file main.c, e quindi è normale che sarà accessibile.

tia86
28-09-2008, 16:04
Okay, ma anche usando un file .h mi da la stessa cosa. Cosa dovrei fare? Compilare a parte f1.c?

oregon
28-09-2008, 16:06
Non capisco perche' lo includi ...

tia86
28-09-2008, 16:19
Ok, risolto. Grazie.

tia86
28-09-2008, 18:12
Un altra domanda, ho visto che se appunto non dichiaro la variabile globale nel file header questa diventa invisibile, anche senza mettere static dentro il file .c
Cioè

f1.h


void f1 (void);


f1.c


int a;
void f1 (void ) { etc };


main.c


#include "f1.h"
int main (void)
{
a++; // non la vede
}


La variabile a nel main non si vede. A questo punto perche si dice che con static la variabile non puo essere usata? O forse diventa visibile con extern?

MItaly
28-09-2008, 20:36
Se vuoi che a sia visibile ad altri file la dichiarerai senza static e metterai nell'header f1.h la dichiarazione


extern int a;. Se metti static di fronte alla definizione di a in f1.c la variabile a non sarà visibile dagli altri file neanche usando extern.

tia86
28-09-2008, 20:38
E se invece non faccio nulla, come nell'esempio, la variabile "a" è visibile oppure no? Perche se non è comunque visibile, che senso ha dichiararla static?

MItaly
28-09-2008, 20:56
Se non usi extern negli altri file ovviamente non è visibile. Considera extern come i prototipi delle funzioni: se li metti vedi anche le funzioni degli altri file. Lo scopo di static è di evitare che una variabile interna ad un file possa essere vista da un altro file. Credo che esso venisse usato ai tempi per velocizzare la compilazione, il linking e (questo ancora più in forse) diminuire la dimensione dei file oggetto, dal momento che l'uso di static produce variabili a linking interno al file.

tia86
28-09-2008, 20:59
Originariamente inviato da MItaly
Lo scopo di static è di evitare che una variabile interna ad un file possa essere vista da un altro file.

Okay, ma quello che non mi torna è che nell'esempio che ho fatto prima io "a" non l'ho dichiarata static, ed è comunque invisibile. Quindi alla fine a che serve visto che è gia invisibile?

Loading