Newsgroup: it.comp.lang.c
Titolo: le variabili globali

salve,
Ho il dev c++.
Voglio imparare ad usare le variabili globali.
Al tale fine ho creato un progetto a 2 file, con due variabili globali che
vengono impiegate
nei due file.
Facendo delle prove, mi sono accorto però che non basta dichiarare la
variabile globale in un
unico file.
Serve dichiararla in ogni file che la impiega (ciò nel mio libro sul C, lo
Schildt, non c'è
scritto, e per questo mi sono mervigliato nel constatare ciò).
Per esempio se la variabile globale "int k" venga impiegata sia in file_1
che in file_2, allora
serve scrivere, all'inizio di ciascuno dei due file, all'esterno di ogni
funzione:
"int k;"
Se invece io scrivo "int k1;" solo all'inizio del file_1, allora, quando
compilo il progetto, mi
dà l'errore: "k1 undeclared".
Dunque ne deduco che le variabili globali vanno dichiarate all'inizio di
ogni file che le
impiega.
E' corretto ciò?
Oppure mi sto sbagliando?
Mi sono anche accorto che se in un file dichiaro:
int k1=1;
allora, nell'altro file, non posso mettere anche lì:
int k1=1;
perchè mi dà l'errore: "multiple definition of k1".
Pertanto le varibili globali, se vengano inizializzate all'atto della
dichiarazione, e cioè
all'esterno di ogni funzione, allora esse vanno inizializzate solo in un
file, e non in entrambi i
file.
E' corretto ciò?
Oppure mi sto sbagliando?
grazie,
adriano

  E' corretto ciò? Oppure mi sto sbagliando?
Corretto.  Una variabile deve essere inizializzata solo dove è definita.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

indispensabile quando la dichiarazione è in un header file (.h).
Ammettiamo che ciò che tu dici sia corretto.
Allora perchè nel codice che segue, nonostante non impieghi "extern", non mi
dà errore, ed il codice viene
eseguito correttamente? (ricordo che impiego il dev c++).
1° FILE:
************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void f_moltiplica_x256_64_64(void);
uint64_t somma_quadrati_64;
uint64_t somma64;
main()
{
somma_quadrati_64=256;
somma64=2;
f_moltiplica_x256_64_64();
printf("somma64=%e\n", (double)somma64);
printf("somma_quadrati_64=%e\n", (double)somma_quadrati_64); getchar();
}
************************************************************
2° FILE:
************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void f_moltiplica_x256_64_64(void);
uint64_t somma_quadrati_64;
uint64_t somma64;
void f_moltiplica_x256_64_64(void)
{
 /*
questa funzione esegue l'istruzione C:
somma64=256*somma_quadrati_64;
*/
uint64_t *p_somma_quadrati_64, *p_somma64;
p_somma_quadrati_64=(uint64_t*)(&somma_quadrati_64);
p_somma64=(uint64_t*)(&somma64);
(*p_somma64)=(*p_somma_quadrati_64)*256;
}
************************************************************
grazie,
adriano

 correttamente? (ricordo che impiego il dev c++).
Come ho scritto mettere la keyword extern non è obbligatorio se fai le
dichiarazioni direttamente nei file.  Ma ripeto IMO è solo una 
questione di chiarezza.
E anche quando le dichiarazioni sono negli header files non è 
obbligatorio mettere la keyword.  Però se non è presente extern viene 
occupato inutilmente dello spazio in tutti quei casi in cui il file .h 
venga incluso in un sorgente .c che poi non usa la variabile.


 venga incluso in un sorgente .c che poi non usa la variabile.
No, non viene occupato alcuno spazio in più. Se hai più dichiarazioni 
della stessa variabile, la variabile avrà un unico indirizzo.
E.

 indirizzo.
È chiaro che se almeno un file del progetto usa la variabile non verrà 
allocato inutilmente spazio.  Ma gli header files possono anche 
dichiarare variabili non usate nel progetto, specialmente se 
dichiarano il contenuto di una libreria.


?manu* ha scritto:

E' una pratica bruttissima e generatrice di problemi.
Senza la key work extern non si puo' distingue dove sta
la definizione.
Ogni variabile globale dovrebbe essere definita in un solo
punto, possibilmente un file sorgente e NON una include,
ed eventualmente dichiarata con extern in un header
file.
B.

grazie a tutti,
adriano

 la definizione.
Certamente, sono d'accordo!
E.