So che i file di intestazione contengono dichiarazioni di varie funzioni, strutture ecc. Utilizzate nel file .c
che "chiama" lo #include
, giusto? Per quanto ho capito, la "separazione dei poteri" si verifica in questo modo:File di intestazione C e compilazione/collegamento
file di intestazione: func.h
contiene dichiarazione anticipata della funzione
int func(int i);
C file sorgente: func.c
contiene definizione di una funzione reale
#include "func.h" int func(int i) { return ++i ; }
file sorgente C source.c
(il programma "reale"):
#include <stdio.h>
#include "func.h"
int main(void) {
int res = func(3);
printf("%i", res);
}
la mia domanda è: visto che il #include
è semplicemente una direttiva del compilatore che copia il contenuto di .h
nel file in cui è #include
, in che modo il file .c
sa come eseguire effettivamente la funzione? Tutto quello che ottiene è il int func(int i);
, quindi come può effettivamente eseguire la funzione? Come si ottiene l'accesso alla definizione attuale di func
? L'intestazione include una sorta di "puntatore" che dice "questa è la mia definizione, laggiù!"?
Come funziona?
Questa è la magia di 'Linker' che risolve le definizioni e garantisce che le cose che hai affermato di esistere durante la compilazione esistano realmente. –
Quando si ha a che fare con i file di intestazione, si potrebbe voler leggere su [include guards] (http://en.wikipedia.org/wiki/Include_guard). –
So di includere le guardie (se non è un tutto) ma le ho omesse per brevità. – Aristides