Newsgroup: it.comp.lang.c++
Titolo: include negli h o nei cpp?

sono anni che lavoro col c++ e solo ieri mi sono accorto di una cosa
che finora mi era sfuggita:
la domanda č: gli #include vanno nell'header o nel cpp? il discorso č
che mettendo gli include nell'header, questi finiscono automaticamente
anche nel cpp, di conseguneza se #includo un <vector> nel file header
č inutile che lo includo anche nel cpp
oppure č utile avere questa ridondanza?
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo


In uno o nell'altro a seconda di dove servano le dichiarazioni.
Tutti gli #include che sono indispensabili per compilare un file header 
vanno messi nel file header; gli altri nel file .cpp. Inserire comunque 
tutti gli #include nel file header ha l'effetto di costringere tutte 
le unità di compilazione che includono quel file header ad includere anche 
file header non indispensabili (creando quindi dipendenze non necessarie).
Max

 oppure č utile avere questa ridondanza?
La ridondanza non e' sempre utile.
Puo' essere utile, semmai, ridurre al minimo indispensabile gli #include 
nei file header. Ci sono almeno un paio di vantaggi nel fare cio':
- gli #include mancanti vengono messi nei cpp, ma e' possibile che non 
tutti i cpp ne abbiano bisogno, quindi si puo' risparmiare qualche 
inclusione;
- si puo' limitare il numero di file header da distribuire es. con una 
libreria gia' compilata.
Il risparmio descritto al secondo punto si avvera quando si evita di 
includere nell'header di una classe un header che serve solo per la sua 
implementazione interna.
Esempio: se in una classe A hai una variabile membro privata di tipo B*, 
e' inutile includere <b.h> in a.h. Dato che e' un puntatore a B, basta 
una forward declaration di class B, e chi usera' la tua classe A non 
avra' bisogno di b.h
In ogni caso io tendo ad includere tutto quello che e' strettamente 
necessario per i tipi, costanti, classi, etc... usati nell'header.
Non mi piace dover dipendere dalla memoria di chi utilizza i miei header 
e non voglio costringere gli altri a mettere gli @include che mi sono 
dimenticato io.
Tutto questo IMHO.
-- 
Roal Zanazzi

 oppure è utile avere questa ridondanza?


Io gli include li metto dove servono.
Se all'interno del corpo di una funzione devo usare un vector, ma questo non
compare nel prototipo della funzione, allora lo metto solo nel .cpp.
Se un header mi serve nel .h, allora lo includo li, tanto nel .cpp me lo
trovo ugualmente.
Mettere headers in sovrabbondanza rallentala compilazione, a dire il vero
solo il preprocessing, ma non ha alcun effetto sul tuo codice (grandezza o
prestazioni).
Usare gli headers solo dove serve fa capire a chi legge il codice quali
strutture dati ed algoritmi ti troverai davanti in quel file... cosa non da
poco quando si lavora in team o su pezzi di codice il cui autore non e'
contattabile per spiegazioni.
Ciao,
Nids

 oppure è utile avere questa ridondanza?
Includi negli header solo il minimo indispensabile, ovvero preferisci
una dichiarazione locale ogni qualvolta sia possibile. Ad es.:
class C;
invece di
#include <C.h>
Nei .cpp non puoi che includere tutto quello che serve (ma niente di
piu'!).
Ciao,
Nicola

 preferisce!
Esistono pero' alcune misure oggettive, come il tempo di compilazione
e l'introduzione di interdipendenze inutili.
Ciao,
Nicola

 prestazioni).
No, rallenta l'intera compilazione se l'header inutile e' incontrato
per la prima volta. Il problema non e' tanto l'inclusione ripetuta di
header utili, tamponata con le header guard, quanto l'inclusione
magari a cascata di header inutili.
Ciao,
Nicola