Newsgroup: it.comp.lang.c++
Titolo: Re: Inclusioni in c

Ok, allora, do UNA risposta cui segue un'altra domanda:
mi e' stato detto che quando il progetto e' molto grosso e si hanno
piu' file che includono diversi header file, si deve utilizzare il
costrutto #ifndef per  evitare di ridefinire le stesse cose piu' volte
come il compilatore proibisce (o almeno cosi mi sembra visto che
rileva errore per il tentativo di ridefinire una struttura o altro
gia' precedentemente inclusa).
Io evitavo questo costrutto perche' mi sembrava di non avere il
controllo del mio codice cioe' mi sembrava come dire:
"non so esattamente cosa sto facendo ma mi servono questi include
quindi se c'erano gia' lasciali stare altrimenti metticeli".
E invece NO perche' il tutto acquista un senso se si pensa al modo con
cui il make lavora ovvero PRIMA crea gli object file di ogni
singolo .c e poi li linka insieme. Pertanto diventa evidente che il
compilatore in fase di creazione degli ojb file non possa sapere se
l'inclusione fatta in uno di questi sia gia' presente in altri object
file che poi verranno linkati ad esso: di conseguenza il costrutto
serve IN FASE DI LINKING per dire al compilatore di "asportare" quelle
definizioni se gia' presenti.
Segue la domanda: analizzando la struttura del makefile, non e'
assolutamente possibile avere il controllo su queste inclusioni senza
usare lo #idndef?
Ovvero, e' possibile analizzandoo il Makefile dire "oK questo e' il
primo oject file che viene linkato e contiene l'inclusione di
"defines.h", quindi il terzo argomento del comando di linking e' un
altro object in cui avevo incluso "defines.h"
ERGO
vado nel codice e RIMUOVO l'inclusione fatta nel terzo file passato al
comando di linking;
Risposta> No perche quando creo l'object file il compilatore DEVE
conoscere per quel file le strutture necessarie a crearlo per
l'appunto: solo poi se queste sono gia' presenti potra dire oK uso
quelle ed elimino queste.
Fa schifo secondo me... ma effettivamente funziona..
i commenti ai miei "postulati" (parola grossa) sono beneaccetti! CIAO

 comprende anche il C.. quindi non ho scritto [OT]
In realta' il tuo messaggio e' davvero fuori tema, un po' perche'
parla di C ed un po' perche' in realta' parla piu' di strumenti
collaterali, che nno di problemi di linguaggio.
Pero' provo a darti una spiegazione astratta, che vale sia in C++ che
in C. In C++ un programma e' composto di unita' di traduzione, che
sostanzialmente corrispondono ai file .cpp dopo che sono stati
elaborati dal preprocessore. Il compilatore elabora ciascuna unita' di
traduzione come un'entita' a se stante, senza tener conto di cosa e'
contenuto nelle altre unita' di elaborazione.
Il modo di procedere e' definire i costrutti del proprio programma nei
file .cpp. Quando questi costrutti devono essere utilizzati da altre
unita' di traduzione si dichiara il costrutto in questione in un
header file e si include questo header nelle opportune unita' di
traduzione.
Nel fare questo bisogna fare attenzione alle interdipendenze tra le
dichiarazioni, che e' un problema particolarmente significativo in C+
+. Idealmente bisognerebbe assicurarsi che ciascun header contenga
solo il minimo indispensabile perche' compili correttamente quando
incluso in un sorgente vuoto.
Do per scontato che tu conosca il meccanismo delle include guard per
assicurarsi che ogni header sia effettivamente "visto" dal compilatore
una volta sola per unita' di traduzione.
Spero che questa spiegazione ti sia di aiuto. In caso contrario ti
suggerisco di eliminare progressivamente pezzi al tuo programma, fino
ad arrivare al punto in cui compila. Se ad ogni passo riesci a
rimuovere grosso modo meta' di quello che resta dovresti riuscire ad
individuare il problema piuttosto in fretta.
Ciao,
Nicola

 Nicola
Ottimo allora avevo capito.. anche se magari manco un po' di
proprieta' del linguaggio :)