потому что компилятор обрабатывает cpp файлы независимо друг от друга
Пример:
файл a.h, содержит ОБЪЯВЛЕНИЕ void a(int);
файл a.cpp, содержит ОПРЕДЕЛЕНИЕ void a(int) { ...}, а также включает a.h: #include "a.h"
файл main.cpp, содержит какие-то методы, которые вызывают a(...), и тоже инклудит a.h
При компиляции будет происходить следующее:
1) Компилятор обработает файл a.cpp, подключит a.h (из-за include) и создаст a.obj (в нем будет скомилированный void a(int))
2) Компилятор обработает файл main.cpp, подключит a.h, и, поскольку на этом шаге он не найдет нигде определение функции void a(int), на места вызовов он положит некие заглушки. Результатом будет main.obj
3) Линкер начнет соединять a.obj и main.obj. То есть искать все определения всех методов и разрешать эти самые заглушки. Если какой-то из методов не будет найдет - будут странные сообщения об ошибках. Если все хорошо, то создаст исполняемый модуль или библиотеку (exe/dll/so/lib/wtf)
Почему так все сделано - ну исторически так сложилось. И компилировать быстрее - при изменении одного cpp файла достаточно перекомпилировать только его (в obj) ну и пересобрать, что в любом случаее быстрее полной перекомпиляции всех файлов
Другие языки программирования и технологии
Почему в C++ заголовки функций и код принято хранить в отдельных файлах?
Потому что когда-то давным-давно в одной далекой галактике компьютеры были большими, но медленными. И чтобы компилятор не перелопачивал весь код от и до, придумали хранить заголовки отдельно.
Потому что заголовок целиком копируется в файл, куда он подключается.
by design
иного объяснения нет
иного объяснения нет
Похожие вопросы
- Вопрос для тех кто знает точный ответ, язык C про функции все подробности вопроса внутри...
- C++ Видимо недоделка в коде?
- определение объема жесткого диска на C++. просьба написать кусок кода. функцию
- C++ полифил функции substr
- c# где ошибка в коде
- Как в C# вызвать событие из кода программы?
- А зачем нужны всякие базы данных? Почему нельзя хранить данные в файле? Так же легче?
- C++ не хочет компилировать код. Не удаётся запустить программу.
- Почему в C++ передача аргумента функции по значению считается более быстрой, чем по ссылке?
- C++. Шаблоны функций