Newsgroup: it.comp.lang.c
Titolo: extern

Perche' questo funziona? Nel file b.c non dovrei dichiarare extern int x?
/*file a.c*/
int x=5;
int main()
{
   f();
   return 0;
}
/*file b.c*/
int x;
void f()
{
   printf("%d\n",x);
}
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

Hai provato a compilarli (non linkarli) singolarmente?
Credo che il compilatore s'incazzi quando compili *solo* b.c
-- 
Quando noi ignoranti eravamo di più, tutto era più bello...
(A. Celentano)
Per rispondermi in privato, prima togli l'immondizia dalla testa.

Anzi... a parte che extern devi dichiararlo in a.c, perchè è lì che usi 
una variabile non dichiarata.
Quindi, correggendo anche il mio post di poco fa, il compilatore si 
incazza quando compili a.c


Machecc... sto dicendo?
Scusa hai creato due file c in cui c'è la variabile x.
Quando compili e linki tutto, le variabili vengono viste come due entità 
separate.
Se vuoi che la variabile sia la stessa, devi appunto dichiararla come 
extern, così in fase di link viene utilizzato lo stesso indirizzo di 
memoria per tutte...


 
E' quello che credevo anche io. Ma se noti x e' inizializzata a 5 nel 
primo file e utilizzata senza inizializzazione nel secondo che stampa 5. 
Quindi la variabile e' la stessa. E anche la funzione non dovrebbe 
essere visibile.


 variabile e' la stessa. E anche la funzione non dovrebbe essere visibile.
Per default tutte le funzioni di un programma C, indipendentemente dal
file in cui sono dichiarate, appartengono allo stesso spazio di nomi E
sono visibili. Quindi e` ovvio che f() sia visibile anche in a.c. L'unica
cosa e` che se attivi i warning il compilatore ti avvisa che f() ha una
dichiarazione implicita. Rendere invisibili le funzioni al di fuori del
file in cui sono definite, e` *necessario* specificare static.
Per le variabili pensavo che fosse necessario specificare extern. Ho fatto
qualche prova e sono giunto a questa conclusione.
Tutte le variabili globali omonime NON INIZIALIZZATE esplicitamente
vengono considerate come se fossero una sola. E` ammessa per questa 
variabile una sola inizializzazione in fase di definizione. Piu`
inizializzazioni provocano la creazione di tante variabili quante
sono le inizializzazioni e, quindi, tanti errori in fase di linking.
Ricapitolando:
/* a.c */
...
int x;
...
/* b.c */
...
int x;
...
In questo caso le due variabili sono la stessa.
/* a.c */
...
int x = 345;
...
/* b.c */
...
int x;
...
/* c.c */
...
int x;
...
In questo caso le tre variabili sono la stessa che prende valore
iniziale 345.
/* a.c */
...
int x = 123;
...
/* b.c */
...
int x = 456;
...
In questo caso il compilatore crea due variabili distinte in a.o e b.o.
Il linker si accorge che esistono due variabili con lo stesso nome e da`
errore (ho verificato).
Riflettendo in termini di tabelle dei simboli, e` anche una cosa logica.
Saluti,
Marco
-- 
To email me, remove the no_ and _spam from my address.

 }
-- 
Horst

Marco Pallante ha scritto:

Quindi se ho capito bene: se una variabile globale non e' inizializzata 
diventa la stessa delle sue omonime negli altri moduli? Ma come si fa a 
capire se lo 0 che contiene e' assegnato dall'utente con 
un'inizializzazione esplicita o se le e' stato assegnato dal compilatore 
perche' e' una globale?


DevarajA ha scritto:

Altra cosa: ma allora extern a cosa serve??


DevarajA ha scritto:

http://groups.google.it/group/comp.lang.c/browse_thread/thread/81a6ac58813c52e4/a60c2aa92428d2c4?hl=it#a60c2aa92428d2c4


 
K&R 2a edizione->Appendice A.10.2+nota finale
