Dubbio file header, definizione e dichiarazioni

di il
8 risposte

Dubbio file header, definizione e dichiarazioni

Scusate,
la questione da mero novello. Continuando lungo il mio percorso, rallentato, di apprendimento del C, a proposito dell'utilizzo dei file header, ma forse più in generale, rispetto alla questione e differenza tra dichiarazione e definizione di entità esterna non mi è chiara del tutto una cosa.

Mi pare di capire che all'interno di un .h non possa scrivere il seguente statment:
int variabile = 100; 
definizione e assegnazione

bensì sembra essere consentita solamente la definizione:

int variabile;
In definitiva la definizione
int variabile;
non solo dichiara la presenza di un variabile di un certo tipo, ma provvede anche ad allocarla…


Non so se questo possa aver a che fare con il fatto che da qualche parte potrei effettuare una dichiarazione:
extern int variabile;
La quale dice non voglio allocare nessuna variabile ma riferirmi a una variabile già definita (e valorizzata?) da qualche altra parte... Forse dunque l'assegnazione è negata nel file header perché sia qualche altro file ad assegnare la variabile?

Scusatemi per la confusione e la non perfetta esposizone del tema.


Grazie a tutti

8 Risposte

  • Re: Dubbio file header, definizione e dichiarazioni

    Ciao,
    extern fa più o meno quello che hai intuito. Se definisci una stessa variabile più volte, il linker ti restituisce errore, ma non il compilatore.
    Tramite extern tu vai solo a dichiarare una variabile e fai capire al compilatore che da qualche parte nel codice tu andrai a definire quella variabile.
    Questo metodo è molto pratico quando si lavora fra più file .c
    Buona norma da Programmatori con la P maiuscola consiste nel giostrare la definizione di tale variabile tramite l'utilizzo dei #define nei file .c

    esempio: in un file header scrivi
    
    #ifdef DEFINITO_QUI
        #define EXT
    #else
        #define EXT extern
    #endif
    
    EXT int a;
    
    
    in uno solo dei tanti file c usi
    
    #define DEFINITO_QUI
    
    così facendo se la variabile viene chiamata proprio da questo file c, viene anche definita, mentre se viene chiamata da un qualsiasi altro file c, l'header associerà alla parola EXT la parola extern e si tratterà quindi di una sola dichiarazione.

    Sia chiaro ti ho passato un'informazione non da poco
  • Re: Dubbio file header, definizione e dichiarazioni

    brugne92 ha scritto:


    Ciao,
    extern fa più o meno quello che hai intuito. Se definisci una stessa variabile più volte, il linker ti restituisce errore, ma non il compilatore.
    Tramite extern tu vai solo a dichiarare una variabile e fai capire al compilatore che da qualche parte nel codice tu andrai a definire quella variabile.
    Questo metodo è molto pratico quando si lavora fra più file .c
    Buona norma da Programmatori con la P maiuscola consiste nel giostrare la definizione di tale variabile tramite l'utilizzo dei #define nei file .c

    esempio: in un file header scrivi
    
    #ifdef DEFINITO_QUI
        #define EXT
    #else
        #define EXT extern
    #endif
    
    EXT int a;
    
    
    in uno solo dei tanti file c usi
    
    #define DEFINITO_QUI
    
    così facendo se la variabile viene chiamata proprio da questo file c, viene anche definita, mentre se viene chiamata da un qualsiasi altro file c, l'header associerà alla parola EXT la parola extern e si tratterà quindi di una sola dichiarazione.

    Sia chiaro ti ho passato un'informazione non da poco
    Ciao Brugne92,
    ti ringrazio molto per la tue dissertazione. Solo due cose:

    tu scrivie
    #ifdef DEFINITO_QUI
        #define EXT
    #else
        #define EXT extern
    #endif
    

    ma non dovrebbe essere, perdonami se non ho compreso:

    #ifdef DEFINITO_QUI
        #define EXT
    #else
        #define extern EXT 
    #endif
    
    In più comunque non mi è chiaro, comunque perché nel file .h non mi è consentita l'assegnazione. Comunque sia questo è indipendente dal fatto che potrei rieffettuare una nuova dichiarazione, no? Ma probabilmente continuo a non comprendere fino in fondo.
    Ti sono molo grato.
  • Re: Dubbio file header, definizione e dichiarazioni

    No è corretto come l'ho scritto io.
    #define extern EXT vuol dire sostituisci extern con EXT.

    se sotto hai EXT int a, allora può diventare
    1) int a se è definito DEFINITO_QUI --->definizione
    2) extern int a se è definito DEFINITO_QUI --->dichiarazione
    Ti invito a rifletterci, fatti degli esempi con due file c e 1 file h.

    In ogni caso è possibile anche definire la variabile dentro un .h, sta a te non commettere errori nel ridefinirla.
    Discorso diverso invece per le funzioni: il compilatore automaticamente assegna la parola extern sulle dichiarazioni, e qui si apre un dibattito senza fine sulla corretta scrittura di un programma, per cui mi fermo qui
  • Re: Dubbio file header, definizione e dichiarazioni

    brugne92 ha scritto:


    No è corretto come l'ho scritto io.
    #define extern EXT vuol dire sostituisci extern con EXT.

    se sotto hai EXT int a, allora può diventare
    1) int a se è definito DEFINITO_QUI --->definizione
    2) extern int a se è definito DEFINITO_QUI --->dichiarazione
    Ti invito a rifletterci, fatti degli esempi con due file c e 1 file h.

    In ogni caso è possibile anche definire la variabile dentro un .h, sta a te non commettere errori nel ridefinirla.
    Discorso diverso invece per le funzioni: il compilatore automaticamente assegna la parola extern sulle dichiarazioni, e qui si apre un dibattito senza fine sulla corretta scrittura di un programma, per cui mi fermo qui
    Grazie mille,
    l'approfondimento è andato ben oltre quello che mi aspettavo. In realtà, tutto nasce dal fatto che in fase di compilazione se nel file .h effettuo anche l'assegnazione ottengo un errore in fase di compilazione.
    Comunque, grazie davvero!
  • Re: Dubbio file header, definizione e dichiarazioni

    Ciao, dipende molto da compilatore a compilatore.
    L'errore te lo da se scrivi
    int variabile;
    variabile=1;

    o anche se scrivi tutto su una riga?
    int variabile=1;

    una volta mi sono messo a interpretare le operazioni che svolge il compilatore e mi pare che sulla stessa riga GCC avesse un comportamento diverso che dichiarare e define su due righe diverse. Prova e dimmi che sono curioso
  • Re: Dubbio file header, definizione e dichiarazioni

    brugne92 ha scritto:


    Ciao, dipende molto da compilatore a compilatore.
    L'errore te lo da se scrivi
    int variabile;
    variabile=1;

    o anche se scrivi tutto su una riga?
    int variabile=1;

    una volta mi sono messo a interpretare le operazioni che svolge il compilatore e mi pare che sulla stessa riga GCC avesse un comportamento diverso che dichiarare e define su due righe diverse. Prova e dimmi che sono curioso
    Ciao,
    interessante quello che mi dici, io sto usando gcc sotto MinGW (32bit) su macchina 64bit. Adesso provo subito e ti faccio sapere...
    Grazie e un saluto!
  • Re: Dubbio file header, definizione e dichiarazioni

    brugne92 ha scritto:


    Ciao, dipende molto da compilatore a compilatore.
    L'errore te lo da se scrivi
    int variabile;
    variabile=1;

    o anche se scrivi tutto su una riga?
    int variabile=1;

    una volta mi sono messo a interpretare le operazioni che svolge il compilatore e mi pare che sulla stessa riga GCC avesse un comportamento diverso che dichiarare e define su due righe diverse. Prova e dimmi che sono curioso
    Ciao Brugne92,
    credo di aver capito l'errore. Se nel file .h dichiaro ed eseguo assegnazione (in tutte le modalità che hai indicato) ottengo errore - credo a ragion veduta - quando lo stesso .h lo includo in più file…

    L'errore che ottengo è "ld returned 1 exit status" - abbastanza misterioso per me - ma gli errori precedenti sembrano confermare quanto ipotizzo

    di seguito riporto le differenze di errori e warning emessi.
    Primo caso:
    
    int varprova;
    varprova = 1;
    
    In file included from TestAssegnazioneVariabileHeader\secondo.c:2:0:
    TestAssegnazioneVariabileHeader\definizioni.h:5:1: warning: data definition has no type or storage class
    varprova = 1;
    ^

    Secondo caso:
    
    int varprova = 1;
    
    TestAssegnazioneVariabileHeader\definizioni.h:5:1: warning: type defaults to 'int' in declaration of 'varprova' [-Wimplicit-int]
    obj\Debug\secondo.o:secondo.c:(.data+0x0): multiple definition of `varprova'
    obj\Debug\main.o:main.c:(.data+0x0): first defined here
    collect2.exe: error: ld returned 1 exit status


    Nel primo caso non capisco il warning: warning: data definition has no type or storage class
    varprova = 1;

    Ma la definizione della variabile non è già avvenuta? In realtà dovrebbe essere già allocata, no?

    Grazie ancora per gli input di approfondimento…
  • Re: Dubbio file header, definizione e dichiarazioni

    In realtà non capisco, ho provato a mettere nel file .h delle direttive condizionali ma l'errore sembra persistere comunque nel caso in cui vi sia l'assegnazione.

    Grazie
Devi accedere o registrarti per scrivere nel forum
8 risposte