2016-12-15 1 views
0

Например, у меня есть класс Foo. Я создаю Foo.h, Foo.cpp, а затем включаю Foo.h в файл main.cpp. Когда я компилирую код, как машина знает, чтобы связать файл заголовка класса и файл cpp класса? Это делается по именам файлов?
Мне действительно интересно понять этот процесс компиляции и ссылки.Как компилятор C++ (или Linker?) Знает, как обрабатывать файлы класса cpp и заголовков?

+4

Эти два файла не связаны. Не нужно. И ни компилятор, ни компоновщик не включили файлы в качестве файлов, потому что до этого шаг препроцессора бросает все вместе. – deviantfan

+1

Этот сайт здесь, чтобы ответить на конкретный вопрос о проблемах с кодом. Вы ищете учебник C. – kabanus

+0

Он вообще не связывает имена файлов, он только ищет имена символов. У вашего 'main.o' будут ссылки на символы _declared_ в' Foo.h', эти символы _defined_ в 'Foo.cpp', поэтому они будут найдены в' Foo.o' во время ссылки. – Useless

ответ

3

Когда я компилирую код, как машина знает, чтобы связать файл заголовка класса и файл 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 
Смежные вопросы