Wiem, że pliki nagłówkowe mają deklaracje forward różnych funkcji, struktur itp., Które są używane w pliku .c
, który "wywołuje" #include
, prawda? O ile mi zrozumieć, w "podziału władzy" występuje tak:Pliki nagłówkowe C i kompilacja/linkowanie
plik nagłówka: func.h
zawiera naprzód deklarację funkcji
int func(int i);
C plik źródłowy: func.c
zawiera rzeczywistego definicji funkcji
#include "func.h" int func(int i) { return ++i ; }
plik źródłowy C source.c
("faktycznego" programu):
#include <stdio.h>
#include "func.h"
int main(void) {
int res = func(3);
printf("%i", res);
}
Moje pytanie brzmi: widząc, że #include
jest po prostu dyrektywa kompilator, że kopie zawartość pliku w pliku #include
, w jaki sposób plik .c
wie, jak właściwie wykonać tę funkcję? Wszystko, co robi, to int func(int i);
, więc w jaki sposób może on faktycznie wykonać tę funkcję? W jaki sposób uzyskuje dostęp do faktycznej definicji func
? Czy nagłówek zawiera jakiś "wskaźnik", który mówi "to moja definicja, tam!"?
Jak to działa?
To jest magia "Linkera", która rozwiązuje definicje i zapewnia, że rzeczy, które według ciebie istniały podczas kompilacji, faktycznie istnieją. –
Kiedy zajmujesz się plikami nagłówkowymi, możesz przeczytać o [include guards] (http://en.wikipedia.org/wiki/Include_guard). –
Wiem o włączeniu strażników (o ile to wszystko), ale pominąłem je dla zwięzłości. – Aristides