инициирование глобальных переменных в разных единицах перевода (с использованием компоновщика) - PullRequest
0 голосов
/ 25 апреля 2018

В последнее время я рассматриваю C ++. Вот мой вопрос См код в file1.cpp и file2.cpp.

file1.cpp

int x1 = 1;
int y1 = x1 + 2;

file2.cpp

#include "necessary_headers"
extern int y1;
int y2 = y1 + 2;
int main()
{
    cout << "y2 is "<<y2<<endl;
    return 0;
}

Я компилирую в другом порядке:

gcc file1.cpp file2.cpp

вывод y2 is 5, конечно.

gcc file2.cpp file1.cpp 

вывод y2 is 2. (Мой вопрос об этом)

Я тоже попробую это: gcc file2.cpp. И это, конечно, undefined reference to y1.

Мой вопрос: почему gcc file2.cpp file1.cpp компилируется, а не выдает undefined reference to y1 ошибку, даже если последовательность ссылок "неправильная"? Это связано с тем, что при связывании file2.cpp компоновщик разумно ссылается на y1, который определен в следующем файле file1.cpp? И таким образом, y1 инициализируется в 0 (значение по умолчанию) в file2.cpp вместо использования определения в file1.cpp? Таким образом, не является ли определение и инициализация в file1.cpp "int y1 = x1 + 2" недействительными последовательностью связывания? Если нет, как я могу выполнить этот оператор для присвоения y1 = x1 + 2? Наконец, это общее поведение компилятора? Согласно стандарту c ++ порядок инициализации глобальных переменных в разных единицах перевода не определен.

Спасибо за вашу помощь! Очень ценю это.

1 Ответ

0 голосов
/ 25 апреля 2018

Мой вопрос: почему gcc file2.cpp file1.cpp компилируется, а не дает неопределенную ссылку на ошибку y1, даже если последовательность ссылок "неправильная"?

С basic.link # 2.1

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

Таким образом, extern int y1; не является неопределенным, если вы компилируете файл (например, file1.cpp), который содержит определение y1.

Для во время компоновки определение y1 проверяется в других единицах перевода.

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