Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [C] Variabili globali

    Salve a tutti,
    ho questo dubbio.
    E' corretto definire variabili globali all'interno di un .h?
    ringrazio anticipatamente tutti.
    Saluti
    Francesco

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

  3. #3
    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???

  4. #4
    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.

  5. #5
    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???
    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".
    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?

    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.
    Puoi definirla in un qualunque file *.c del progetto.
    Se la definisci all'interno di una qualunque funzione (e main è una funzione) non sarà una variabile globale, ma locale alla funzione stessa.

  6. #6
    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.

  7. #7
    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.
    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).

    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?)
    ;-)

    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.
    Prego, buona giornata a anche a te.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,468
    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 ...

  9. #9
    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 ...
    No, NON è possibile!
    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
    codice:
    // pippo.h
    extern int gVariable; // dichiarazione (NON definizione) di una variabile globale definita altrove in un *.c
    ed includere il file corrispondente, piuttosto che copia/incollarselo negli *.c che ne abbisognano.
    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.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,468
    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' ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.