Забудьте на секунду о файлах заголовков и посмотрите на следующую программу:
// Forward declare foo()
void foo();
int main() {
foo();
return 0;
}
Я могу скомпилировать эту программу нормально, но если я попытаюсь связать ее, я получу сообщение об ошибке строки:
Мне обещали, что функция с именем foo()
существует, но я нигде не могу ее найти.
Теперь, если я свяжу ту же программу против библиотеки, которая предоставляет функцию foo()
, тогда все будет в порядке.
Заголовок - это просто формальный способ упаковки всех предварительных объявлений библиотеки (и некоторых других вещей) способом который точно документирует содержимое библиотеки. Но это всего лишь условность. Пока предварительные объявления видны компилятору из где-то , это все, что действительно требуется.
Помните: #include "path/to/file.h"
буквально означает «скопировать и вставить содержимое этого файла сюда. . "
Это почти то же самое, что и моя исходная программа:
//foo.h
void foo();
//main.cpp
#include "foo.h"
int main() {
foo();
return 0;
}