В последнее время я рассматриваю 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 ++ порядок инициализации глобальных переменных в разных единицах перевода не определен.
Спасибо за вашу помощь! Очень ценю это.