как компоновщик находит правильный файл, чтобы использовать его объявление функции? - PullRequest
3 голосов
/ 15 февраля 2012

В простой программе, которая использует функцию doSomething (), чтобы распечатать «привет, мир».Я набрал только прототип этой функции в файле main.cpp и объявление этой функции в другом файле с именем do.cpp.

, когда я компилирую программу, она работает правильно, даже если я не указал, какой файлобъявление doSomething () будет.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2012

Компоновщик просто учитывает все файлы, с которыми вы ссылаетесь, при поиске определения функции.

Невозможно связать несколько объектных файлов, которые определяют функцию с одинаковым именем, поэтому нет никакой двусмысленности.

0 голосов
/ 15 февраля 2012

В вашей идее о функции объявление и определение .
, кажется, есть некоторая путаница Объявление функции является прототипом функции.
Например:

void doSomething();

Хотя определение является телом функции.
Например:

 void doSomething()
 {
 }

Обычно объявление отправляется в заголовочный файл, а определение в файл cpp.

Компилятор использует объявление для сопоставления параметров вызываемой функции, в то время как компоновщик связывает определение с вызываемой функцией.

Компиляция - это процесс, в котором исходные файлы компилируются в объектные файлы.
Во время компоновки все объектные файлы используются компоновщиком для создания исполняемого файла. компоновщик имеет доступ к различным объектным файлам и, следовательно, к определению функции, определенной в другом файле. Пока имя функции уникально, компоновщик с радостью будет ссылаться на это конкретное определение, в случае, если компоновщик найдет более двух совпадений, то ваша программа прервется Одно правило определения и будет сообщать о множественных ошибках определения.

Также обратите внимание, что компоновщик должен использовать (связывать) определение функции только в том случае, если функция вызывается, если ваша программа просто объявляет функцию, не предоставляет определения и никогда не использует (вызывает) функцию, которая там не будет быть какие-либо ошибки.

...