Domanda su #include in C

di il
2 risposte

Domanda su #include in C

Quando vogliamo includere un file si usa
#include "nomefile.h"
questo fa un copia-incolla di ciò che c'era scritto in quel file e lo sostituisce all'include.
In questo modo si possono usare le funzioni presenti in quel file.
La mia domanda è come fa il compilatore a trovare il file ".c" che corrisponde al file ".h"
dopo tutto il file .h non contiene
#include "nomefile.c"
eppure le implementazioni delle
funzione vengono caricate lo stesso.
Dove posso leggere riguardo questa funzionalità in particolare del C?

2 Risposte

  • Re: Domanda su #include in C

    Non lo sa. Il processo di build si articola in diverse fasi, due di queste sono:

    compilazione
    I file c vengono tradotti separatamente in linguaggio macchina e per ognuno di essi genera un file oggetto (.obj, .o). In questa fase il compilatore non ha bisogno delle definizioni, gli basta sapere la dichiarazione. Al posto delle chiamate metterà dei segnaposto (non so se c'è un nome tecnico). Ovviamente il file oggetto non può essere eseguito.

    linking
    Il linker si occupa di cercare le le definizioni di funzioni e le variabili esterne dichiarate, ma non definite nei file c del progetto. Viene fuso tutto nell'exe e i segnaposto sostituiti con l'indirizzo delle funzioni. Se le funzioni si trovano in librerie dinamiche esterne (es. DLL su Windows, SO su Linux), ci mette una chiamata al sistema operativo.

    Prova a scrivere un codice con sole dichiarazioni di funzioni, ma senza chiamarle, dovrebbe compilare lo stesso. Poi prova a mettere la chiamata, ma senza averle definite, ti darà un errore di linking, ma non di compilazione.

    Questo succede a grandi linee. Cerca di Google qualcosa come compiling and linking process.
    https://www.cprogramming.com/compilingandlinking.htm
  • Re: Domanda su #include in C

    La corrispondenza viene fatta sulla firma delle funzioni (valore restituito, nome, argomenti) e non sui nomi dei file.
Devi accedere o registrarti per scrivere nel forum
2 risposte