При использовании нескольких файлов на C++, например: main.cpp, Definition.cpp, Declaration.h
// declaration.h
int Myfunc();
//definition.cpp
#include "declaration.h"
int MyFunc() {return 5;};
// main.cpp
#include <iostream>
#include "declaration.h"
int main()
{
std::cout << Myfunc() << std::endl;
}
Почему мне не нужно включать файл определения в основной файл? Как программа может узнать определение Myfunc()
, если я включил только объявление?
Определение включается в исполняемый файл на этапе компоновки процесса сборки. См., например. stackoverflow.com/q/6264249/9988487 для более подробной информации.
Это ответственность Линкера.
Я думаю, что второй ответ объясняет вашу проблему.
Из-за следующего этапа: «Связывание». Обычно что происходит: Компиляция делает definition.cpp => definition.o
и main.cpp => main.o
Затем мы связываем объектные файлы в исполняемый файл: main.o + definition.o => application
Включение заголовка приводит к поиску имен, используемых в исходном файле, в этом заголовке и других заголовках. Компиляторы удовлетворяются объявлением имени, как в вашем случае, когда компиляция завершается, для каждой единицы перевода существуют объектные файлы. Компоновщик связывает этот объектный файл (содержащий определения) с некоторыми другими библиотеками, генерирующими исполняемый файл. Если компоновщик не находит определение, он не может связать.
Я написал несколько статей об этой проблеме; Вы можете найти их здесь и здесь.
Спасибо! Это вместе с комментарием @MartinYork ответило на мой вопрос!
Как вы компилируете программу? Есть ли какой-либо файл конфигурации или это проект Visual Studio?