У вас есть файл A.cpp
, который включает B.h
. Когда вы компилируете A.cpp
, препроцессор будет включать в себя все, от файла B.h
до единицы перевода A.cpp
, и компилятор создаст из него объектный файл.
На данном этапе компилятору все равно, что находится в B.cpp
. Это рассматривается отдельно, когда компилятор компилирует единицу перевода B.cpp
. На этом этапе компилятор верит, что в будущем (во время соединения) будет что-то при вызове чего-то из B
. В противном случае вы получите ошибку компоновщика (скорее всего, неопределенные символы).
Вот вам очень хороший ответ о том, что происходит: Как работает процесс компиляции / компоновки?
Но просто, чтобы описать это в меньшем количестве слов:
- Препроцессор: считывает ваши
.cpp
и включенные .h
файлы (например, A.cpp
и B.h
и создает вывод, который компилятор затем может скомпилировать. Это также произойдет независимо для B.cpp
и включает в себя / определяет)
- Компилятор: принимает выходные данные препроцессора и создает объектные файлы. Объектные файлы содержат в основном машинный код и некоторую информацию о компоновщике
- Linker: связывает объектные файлы вместе, поэтому при запуске программы вызываются нужные им функции.
Так что я думаю, что соединение, которое вы ищете, происходит на этапе Linking. Вот где все кусочки собираются вместе.