Например, у меня есть класс Foo. Я создаю Foo.h
, Foo.cpp
, а затем включаю Foo.h
в файл main.cpp
. Когда я компилирую код, как машина знает, чтобы связать файл заголовка класса и файл cpp класса? Это делается по именам файлов?
Мне действительно интересно понять этот процесс компиляции и ссылки.Как компилятор C++ (или Linker?) Знает, как обрабатывать файлы класса cpp и заголовков?
ответ
Когда я компилирую код, как машина знает, чтобы связать файл заголовка класса и файл cpp класса? это делает это по имени файлов?
Нет, такого типа автоматической ассоциации, сделанной компилятором, нет.
Если у вас есть файл заголовка, содержащий все объявления функций и классов, он должен быть #included
из любой единицы перевода (.cpp
), которая использует его.
Этот шаг (контрактов на декларацию) выполняется c-препроцессором, где каждое вхождение #include "MyDeclarations.hpp"
заменяет это на полное содержимое файла MyDeclarations.hpp
в блоке перевода.
Простой пример:
Foo.hpp
class Foo {
public:
Foo(); // Constructor declaration
};
foo.cpp
#include "Foo.hpp" // <<<< Include declarations
Foo::Foo() {} // Constructor definition
main.cpp
#include "Foo.hpp" // <<<< Include declarations
int main() {
Foo foo; // <<<<< Use declarations
}
Чтобы, наконец, поручить ваш компоновщик Стич все эти файлы вместе вы должны обратиться к сгенерированным из перевода единиц. В зависимости от инструментальной цепи немного, но, например, GCC вы можете использовать некоторую командную строку компилятора, например
$ g++ main.cpp Foo.cpp -o myProg
Эти два файла не связаны. Не нужно. И ни компилятор, ни компоновщик не включили файлы в качестве файлов, потому что до этого шаг препроцессора бросает все вместе. – deviantfan
Этот сайт здесь, чтобы ответить на конкретный вопрос о проблемах с кодом. Вы ищете учебник C. – kabanus
Он вообще не связывает имена файлов, он только ищет имена символов. У вашего 'main.o' будут ссылки на символы _declared_ в' Foo.h', эти символы _defined_ в 'Foo.cpp', поэтому они будут найдены в' Foo.o' во время ссылки. – Useless