Vedila così.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)?
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
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.codice:int i;
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
volendoci accedere da un altro .cpp la si dichiarerà concodice:int varGlobale;
.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).