Например, у меня есть класс 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
- 1. Как обрабатывать файлы cpp и файлы заголовков
- 2. заголовков и CPP файлы
- 3. Основные stucture проекта C/C++ (файлы заголовков и CPP файлы)
- 4. Компилятор находит файлы заголовков, но не файлы cpp?
- 5. Использование класса Заголовков и CPP файлы в C++
- 6. Как компилятор знает, как другие .cpp-файлы используют статический член const?
- 7. C++, включая файлы cpp
- 8. Как C++-компоновщик знает, какие файлы .cpp использовать
- 9. C компилятор не находит файлы заголовков
- 10. , разделяющий класс C++ на файлы заголовков и cpp
- 11. C++ файлы cpp как модули
- 12. Как компилятор знает, где моя основная функция?
- 13. Заголовок и cpp или только файлы cpp - лучшая практика?
- 14. Включая файлы заголовков в C++ (определение класса и реализация метода)
- 15. Как связать файлы заголовков в C++
- 16. объявление заголовков и cpp-файлов C++
- 17. Linker Error при выделении кода в .h и .cpp файлы
- 18. Как компилятор знает, что переменная является глобальной или локальной (C)
- 19. makefile: как указать файлы заголовков
- 20. Как компилятор gcc_4.8.1 знает, где искать заголовки?
- 21. Интервью: concatenate и дополнение, как компилятор знает
- 22. Шаблоны и .cpp-файлы
- 23. Как создать файлы заголовков C
- 24. Строка интернирования. Как компилятор знает?
- 25. Файлы заголовков C и компиляция/привязка
- 26. -Werror = формат: как компилятор знает
- 27. CPP - Включая файлы .h и .cpp файлы в .cpp-файл
- 28. Компиляция файлов заголовков и cpp в g ++
- 29. Как вы пишете язык программирования и файлы заголовков в c
- 30. Файлы заголовков в C
Эти два файла не связаны. Не нужно. И ни компилятор, ни компоновщик не включили файлы в качестве файлов, потому что до этого шаг препроцессора бросает все вместе. – deviantfan
Этот сайт здесь, чтобы ответить на конкретный вопрос о проблемах с кодом. Вы ищете учебник C. – kabanus
Он вообще не связывает имена файлов, он только ищет имена символов. У вашего 'main.o' будут ссылки на символы _declared_ в' Foo.h', эти символы _defined_ в 'Foo.cpp', поэтому они будут найдены в' Foo.o' во время ссылки. – Useless