Препроцессор, среди прочего, рекурсивно заменит все директивы #include
на код этих заголовков. (По сути, это тупая машина для замены текста.) Результат, исходный файл со всеми включенными в него рекурсивно скопированными заголовками, называется единицей перевода . По сути, это то, что видит ваш компилятор (хотя современные компиляторы часто объединяют разные этапы процесса перевода, чтобы быть быстрее).
Вы можете иметь несколько единиц перевода, участвующих в одной результирующей программе. (На самом деле, с чем-то, превышающим 50 строк кода, это в значительной степени стандарт.)
Когда вы определяете функции в заголовках (в отличие от , объявляющих их), и заголовки с этими определениями затем включаются в несколько исходных файлов, которые должны быть связаны некоторый исполняемый файл, то компоновщик найдет несколько определений одних и тех же функций и перестанет выдавать неприятное сообщение об ошибке.