Внутренние функции автоматически объявляются в C ++? - PullRequest
2 голосов
/ 12 апреля 2020

Рассмотрим файл functions.cpp:

// functions.cpp

void f1(){/* do something */}

void f2()
{
    f1();
}

Я sh могу использовать функцию f2 в другом файле cpp, поэтому я создаю файл заголовка functions.h:

// functions.h

#ifndef F2
#define F2

void f2();

#endif

Теперь в файле main.cpp я звоню f2:

// main.cpp

#include "functions.h"

int main()
{
    f2();
    return 0;
}

Компиляция работает нормально, но я не объявил f1 в functions.h , Итак, когда вызывается f2, как компилятор узнает о f1?

Ответы [ 2 ]

5 голосов
/ 12 апреля 2020

При переводе main.cpp внешняя ссылка генерируется для функции f2. Грубо говоря, это означает, что объектный файл, сгенерированный компилятором, содержит инструкции для вызова функции по определенному адресу и оставляет метаданные, указывающие компоновщику заполнить фактический адрес f2. Отдельно компилятор переводит functions.cpp и внутренне разрешает ссылку с f2 на f1 и выдает объектный файл, содержащий определение f2. Затем компоновщик, увидев как объектный файл, содержащий f2, так и объектный файл, для которого требуется адрес f2, «связывает» их вместе в исполняемый файл. Таким образом, вызывающему f2 не нужно знать о объявлениях любых сущностей, используемых f2.

1 голос
/ 12 апреля 2020

void f1(){/* do something */} является одновременно декларацией и определением f1 и является видимым для f2. Исходные файлы анализируются сверху вниз. Так что f2 имеет все, что нужно, и вызывающие f2 не должны знать о f1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...