Salve a tutti,
ho questo dubbio.
E' corretto definire variabili globali all'interno di un .h?
ringrazio anticipatamente tutti.
Saluti
Francesco
Salve a tutti,
ho questo dubbio.
E' corretto definire variabili globali all'interno di un .h?
ringrazio anticipatamente tutti.
Saluti
Francesco
Formalmente sì, in pratica no.
Praticamente se l'header in cui viene definita la variabile globale, viene incluso da più di un file *.c il compilatore compila, ma il linker no perché giustamente ti dirà che hai definito la stessa variabile in più punti (nei file *.c che includono l'header contenente la definizione della variabile globale).
Attenzione che se la definisci static, la variabile sarà globale ma localmente al singolo *.c che la include. In soldoni tu crederai d'aver definito una variabile globale, ma in realtà ne avrai create tante quante volte l'header è stato incluso da differenti file *.c.
Il modo corretto per definire una variabile globale è pertanto, definirla in un solo *.c, e dichiararla extern in un header che sarà incluso dagli *.c che vogliono utilizzarla.
Ti ringrazio per la risposta,
ma la cosa strana è che il tutto sembri funzionare correttamente.
Pensando a ciò che hai detto non riesco a capire come sia possibile.
La variabile non è stata definita static...
Come è possibile questo???
Mi sfugge qualcosa???
se volessi definire le variabili in un unico file .c potrei definirla nel file che contiene il main???
all'interno o all'esterno del main(){}???
Grazie anticipatamente per le risposte.
L'header viene incluso da un solo file *.c o da più file *.c? Se viene incluso in un solo file *.c (come ti ho già scritto nel post precedente) può funzionare, altrimenti no. Se ti funziona includendolo in più file *.c, allora vuol dire che nell'header non è definita una variabile globale, ma qualcos'altro, oppure che stai compilando senza "linkare".Originariamente inviato da francescoprogc
Ti ringrazio per la risposta,
ma la cosa strana è che il tutto sembri funzionare correttamente.
Pensando a ciò che hai detto non riesco a capire come sia possibile.
La variabile non è stata definita static...
Come è possibile questo???
Mi sfugge qualcosa???
Ripeto: se includi in più file *.c un header contenente la definizione di una variabile globale, il linker si inca**a: più variabili globali con lo stesso nome?
Puoi definirla in un qualunque file *.c del progetto.Originariamente inviato da francescoprogc
se volessi definire le variabili in un unico file .c potrei definirla nel file che contiene il main???
all'interno o all'esterno del main(){}???
Grazie anticipatamente per le risposte.
Se la definisci all'interno di una qualunque funzione (e main è una funzione) non sarà una variabile globale, ma locale alla funzione stessa.
Sei stato gentilissimo e ho seguito il tuo consiglio.
Cmq credimi il punto h dove ho definito la vaibile è stato incluso in + file *.c e il programma una volta mandato in esecuzione ( e quindi con linker attivo) funziona correttamente.
Come ti dicevo cmq ho fatto come da te detto anche perkè mi sembra la cosa + giusta da fare anche dal punto di vista concettuale.
Sei stato gentilissimo e utilissimo.
Ti Auguro buon proseguimento di giornata.
Certo che ti credo: probabilmente hai compilato un file *.c, poi hai modificato l'header aggiungendogli la definizione della variabile globale, poi hai compilato l'altro file *.c (senza ricompilare il primo), ed hai "linkato" il primo compilato con l'header vecchio non contenente la definizione della variabile globale, ed il secondo con l'header nuovo contenente la definizione della variabile globale (o viceversa).Originariamente inviato da francescoprogc
Sei stato gentilissimo e ho seguito il tuo consiglio.
Cmq credimi il punto h dove ho definito la vaibile è stato incluso in + file *.c e il programma una volta mandato in esecuzione ( e quindi con linker attivo) funziona correttamente.
Ma se mi dici che hai compilato e linkato i due file includenti lo stesso file header con la definizione della stessa variabile globale, allora non ti credo! (salvo opzioni strambe di compilazione eh?)
;-)
Prego, buona giornata a anche a te.Originariamente inviato da francescoprogc
Come ti dicevo cmq ho fatto come da te detto anche perkè mi sembra la cosa + giusta da fare anche dal punto di vista concettuale.
Sei stato gentilissimo e utilissimo.
Ti Auguro buon proseguimento di giornata.
E' possibile se ha scritto
#ifndef _FILE_H_
#define _FILE_H_
...
#endif
in modo che il file venga considerato solamente una volta ...
Ma la dichiarazione di variabili negli include non e' proprio una cosa da farsi ...
No, NON è possibile!Originariamente inviato da oregon
E' possibile se ha scritto
#ifndef _FILE_H_
#define _FILE_H_
...
#endif
in modo che il file venga considerato solamente una volta ...
Ma la dichiarazione di variabili negli include non e' proprio una cosa da farsi ...
Forse non hai seguito bene il thread: in tutto il thread si parla di definizione, non dichiarazione! Gli include servono proprio per condividere dichiarazioni compreso quindi le dichiarazioni delle variabili globali. Ad esempio è meglio infilare la seguente dichiarazione (NON definizione) in un file *.h
ed includere il file corrispondente, piuttosto che copia/incollarselo negli *.c che ne abbisognano.codice:// pippo.h extern int gVariable; // dichiarazione (NON definizione) di una variabile globale definita altrove in un *.c
l'"ifndef" trick che hai mostrato serve per evitare inclusioni ricorsive, nella stessa unità di compilazione (leggi un *.c), NON in diverse unità di compilazione! Il preprocessore infatti lavora solo a livello di unità di compilazione, NON a livello di linker. E' il linker che ti stoppa se definisci due varibili globali, o funzioni globali, con lo stesso nome, NON il compilatore. Perciò le definizioni vanno negli *.c le dichiarazioni nei *h!
;-)
p.s: osserva che in pippo.h non ho usato l'ifndef trick (che va utilizzato sempre) proprio per enfatizzare che in questo caso, il rischio di inclusione ricorsiva, non c'entra nulla.
Ok ... ok ... calma ... !
Ho risposto in maniera affrettata senza leggere bene tutto il thread e avendo in testa altro, ma mi pare che ti sia scaldato un po' ...