Соединение заголовочных файлов - PullRequest
0 голосов
/ 06 мая 2019

Как заголовочные файлы связаны с cpp файлами? У меня есть файл cpp, включая файлы заголовков. Я понимаю, что делает include, но как насчет файла cpp заголовочного файла?

Допустим,

calculate.cpp:

#include table.h

Что происходит с таблицей .cpp? Чтобы полностью понять Calculate.cpp, нужно ли рассматривать table.cpp?

Ответы [ 2 ]

1 голос
/ 06 мая 2019

У вас есть файл A.cpp, который включает B.h. Когда вы компилируете A.cpp, препроцессор будет включать в себя все, от файла B.h до единицы перевода A.cpp, и компилятор создаст из него объектный файл.

На данном этапе компилятору все равно, что находится в B.cpp. Это рассматривается отдельно, когда компилятор компилирует единицу перевода B.cpp. На этом этапе компилятор верит, что в будущем (во время соединения) будет что-то при вызове чего-то из B. В противном случае вы получите ошибку компоновщика (скорее всего, неопределенные символы).

Вот вам очень хороший ответ о том, что происходит: Как работает процесс компиляции / компоновки?

Но просто, чтобы описать это в меньшем количестве слов:

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

Так что я думаю, что соединение, которое вы ищете, происходит на этапе Linking. Вот где все кусочки собираются вместе.

0 голосов
/ 06 мая 2019

Нет никакой связи с точки зрения компилятора

Вы можете иметь весь проект в одном файле, который может быть .h, и вы все равно сможете его собрать и запустить. Это не рекомендуется, но вы можете сделать это

Основная причина наличия файлов .cpp и .h состоит в том, чтобы логически отделить открытый интерфейс от внутренней реализации.

Когда мне нужно использовать компонент cpp, я обычно читаю только файл .h

...