Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140

    [C++] Dichiarazioni e definizioni

    Salve a tutti
    vorrei chiedervi la differenza tra dichiarazione e definizione in C++ ... io ho letto (sulle dispense del mio corso universitario) che la dichiarazione non comporta allocazione di memoria da parte del compilatore... invece la definizione comporta allocazione di memoria (esempio: iint x; )
    E' vera questa distinzione? Potreste farmi qualche esempio (soprattutto di dichiarazione)?

    PS. E' vero che invece in Java non c'è questa distinzione tra dichiarazione e definizione?

    Grazie in anticipo

  2. #2

    Re: [C++] Dichiarazioni e definizioni

    Originariamente inviato da mico
    Salve a tutti
    vorrei chiedervi la differenza tra dichiarazione e definizione in C++ ... io ho letto (sulle dispense del mio corso universitario) che la dichiarazione non comporta allocazione di memoria da parte del compilatore... invece la definizione comporta allocazione di memoria (esempio: iint x; )
    E' vera questa distinzione? Potreste farmi qualche esempio (soprattutto di dichiarazione)?
    Vedila così.
    In un programma C++ ci sono dei nomi, che si possono riferire a variabili, funzioni, classi, membri di classi, ... Quando tu fai una dichiarazione, stai semplicemente dicendo al compilatore che cos'è quel nome, cioè se è una variabile, una funzione, una classe, un typedef o altro ancora, e in genere gli precisi anche un po' meglio esattamente come è fatto (se è una variabile gli dici di che tipo è, se è una funzione dici il suo prototipo). Questo consente al compilatore di sapere di cosa si sta parlando quando vengono citati i nomi in questione.
    Quando tu invece definisci qualcosa, stai dicendo effettivamente al compilatore "ok, ora questo nome non è solo un simbolo", ma ci associ dello spazio in memoria effettivamente riservato (se si parla di una variabile), un corpo contenente delle istruzioni (se si parla di una funzione), un corpo contenente i suoi membri (se si parla di una struct o di una classe).

    La confusione tra le due cose nasce dal fatto che spesso e volentieri dichiarazioni e definizioni coincidono; per esempio, quando dichiari una variabile locale
    codice:
    int i;
    contemporaneamente la stai dichiarando ("hey compilatore, se incontri in giro i sappi che è una variabile di tipo intero") e la stai definendo ("hey compilatore, segnati di allocare lo spazio per una variabile di tipo intero a cui mi riferisco con il nome i"); quando scrivi direttamente una funzione e il suo corpo senza averne prima scritto il prototipo la stai contemporaneamente dichiarando e definendo. E così via.

    D'altra parte spesso è necessario separare dichiarazione e definizione. In primo luogo (tranne alcune eccezioni), se hai a che fare con progetti C++ con più file, vale la one definition rule, ossia tutto ciò che ciascun modulo oggetto definisce e che ha visibilità generale (ossia, ogni funzione, metodo e variabile globale che non siano dichiarati come static) deve essere definito una sola volta (ci sono alcune eccezioni specificate a §3.2 ¶5 dello standard, ma per ora lasciamo stare). Pertanto, non puoi includere brutalmente il corpo di una funzione condivisa o ridefinire una variabile globale in ogni .cpp; piuttosto, devi dire al compilatore "guarda che questa roba esiste, non te la definisco qui perché è già definita in altri file, ma fidati che c'è ed è fatta in questa maniera". È qui dunque che si devono utilizzare le dichiarazioni: pertanto se c'è in un .cpp una variabile globale definita come
    codice:
    int varGlobale;
    volendoci accedere da un altro .cpp la si dichiarerà con
    codice:
    extern int varGlobale;
    .
    Nota che lo spazio in memoria per varGlobale viene effettivamente allocato soltanto nel .cpp in cui è definita, in tutti gli altri si dice soltanto al compilatore che la variabile esiste e che ha quel tipo lì (toccherà poi al linker tirare le fila).

    Un concetto analogo vale per le funzioni e i prototipi; la questione comunque è spiegata nel dettaglio a §3.1 e seguenti dello standard C++ (di cui si trovano in rete gratuitamente le bozze).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    Spiegazione esauriente!!!!!

    Ultima cosa: in java è vero quindi che non è possibile separare definizione e dichiarazione?

  4. #4
    Originariamente inviato da mico
    Spiegazione esauriente!!!!!

    Ultima cosa: in java è vero quindi che non è possibile separare definizione e dichiarazione?
    Mah, non ho particolare esperienza con Java, ma se non erro è così; se non ricordo male il compilatore Java considera tutti insieme i vari file da compilare, e le forward declarations non sono necessarie perché il compilatore è in grado di attendere fino alla fine del file per la definizione effettiva dei vari pezzi. Se non sbaglio questo dipende anche da come è fatta la grammatica Java.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di mico
    Registrato dal
    Jul 2005
    Messaggi
    140
    Ok..... Grazie tante

  6. #6
    Di niente, ciao!
    Amaro C++, il gusto pieno dell'undefined behavior.

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.