[C] Dubbio su file

Messaggioda ZfreS » 06/12/2020, 19:10

Ultimamente mi capita di scrivere progetti di programmazione un po lunghi per cui mi è utile dividerli in file: uno dove tengo il main per fare i vari test, uno .h dove tengo le definizioni di strutture, funzioni e variabili globali, l'altro .c con l'implementazione delle varie. Nel file .c devo intestare il .h così come nel main, ma ciò che non capisco è, come fa il compilatore a capire dove sono implementate le funzioni del .h senza che sia intestato nel file .h il file .c?
[URL=https://datesnow.life]Authentic Ladies[/URL]
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 2167 di 4590
Iscritto il: 22/10/2016, 17:52
Località: Usa

Re: [C] Dubbio su file

Messaggioda DeltaEpsilon » 06/12/2020, 21:12

Se ho capito bene, stai chiedendo come fa il compilatore a sapere che i simboli dichiarati nell'header file sono definiti nel corrispondente file .c

Il compilatore non si occupa di questo, pertanto non può saperlo.

Chi pensa a questo è il linker (fai un ripasso delle fasi di compilazione) che, dopo che i vari file sorgenti vengono compilati in codice oggetto, si preoccupa di "risolvere" tutti i riferimenti a simboli esterni.

Se non ci riesce, ottieni il famoso messaggio di errore "undefined reference to..." :D
É così dichiarato che è celato! Non c'è nulla di più sfuggente dell'ovvio. (Sherlock Holmes)
Avatar utente
DeltaEpsilon
Average Member
Average Member
 
Messaggio: 287 di 648
Iscritto il: 08/04/2019, 18:58

Re: [C] Dubbio su file

Messaggioda ZfreS » 06/12/2020, 22:31

Perfetto, tutto chiaro, grazie mille!
[URL=https://datesnow.life]Authentic Ladies[/URL]
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 2168 di 4590
Iscritto il: 22/10/2016, 17:52
Località: Usa

Re: [C] Dubbio su file

Messaggioda apatriarca » 07/12/2020, 15:44

Credo sia necessario fare qualche discorso aggiuntivo su come funziona la compilazione di codici in C. Per prima cosa possiamo dividere la creazione di un eseguibile a partire da codice C nelle seguenti fasi:
  • Precompilazione. In questa fase il codice viene modificato in base alle istruzioni di precompilazione (quelle che iniziano con #). In particolare l'istruzione #include causa l'inclusione del file header per intero in quella particolare posizione del file. Vengono poi sostituite le macro con il loro codice. Non sapendo quanto tu sia familiare con il preprocessore non entro nei dettagli. È di solito possibile ottenere l'output di questa fase con una opzione del compilatore, ma di solito l'output è solo tenuto in memoria e usato per le fasi successive senza produrre file.
  • Compilazione. In questa fase ogni file sorgente precompilato viene convertito in codice macchina. Ogni file di output farà riferimento ad un certo numero di simboli di cui conosce alcune informazioni come il tipo ma a cui non ha accesso e alcuni simboli che sono invece stati implementati all'interno del codice sorgente.
  • Linking In questa fase il linker prende tutti i codici oggetto generato nella fase precedente e cerca di risolvere tutti i collegamenti mancanti.

Ci sono quindi diverse considerazioni da fare:
  • Quella di avere file header è una convenzione, per quanto utile, e non è necessaria. Potresti infatti inserire direttamente le definizioni di tutti i simboli che ti servono direttamente nei file sorgenti che dovrebbero includere quel file header e la compilazione funzionerebbe lo stesso. Il nome di questi file è un'altra convenzione e potresti ad esempio avere file header e sorgenti con nomi che non hanno alcuna relazione e non avere alcuna diretta relazione tra i file header e i singoli file sorgenti.
  • Nell'ultima fase è anche possibile aggiungere librerie dinamiche o statiche che definiscono i vari simboli. Un tuo eseguibile può ad esempio dipendere da una libreria dinamica "pippo.dll" che verrà cercata durante l'esecuzione del tuo eseguibile per risolvere alcuni particolari simboli.
  • Se vai a guardare nella cartella di compilazione dovresti trovare almeno i file oggetto prodotti nella seconda fase. La presenza di questi file permette di velocizzare le compilazioni di progetti di più grosse dimensioni quando si modificano solo pochi file perché le prime due fasi diventano necessarie solo per i file modificati.
  • Altri linguaggi non seguono necessariamente tutte queste fasi o possono presentare anche grosse differenze.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5518 di 10439
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite