Предположим, у меня есть следующие три файла.
заголовок.h:
int SomeFunction();
inline int a = SomeFunction();
файл1.cpp:
#include "header.h"
int b = a + 5;
файл2.cpp
#include "header.h"
int c = a + 3;
Гарантированно ли, что a
инициализируется перед b
и c
, что приводит к b == a + 5
и c == a + 3
?
Насколько я понимаю, в единице компиляции у меня есть гарантия, что переменные области файла инициализируются в порядке сверху вниз. Но распространяется ли эта гарантия на встроенные переменные, поскольку они существуют только один раз, даже если они определены в нескольких единицах компиляции.
Я понимаю, что у меня нет никаких гарантий относительного порядка `b' и 'c', но это не проблема, поскольку они не зависят друг от друга.
a
имеет константную инициализацию, потому что 7
является константным выражением, поэтому порядок динамической инициализации в любом случае не имеет значения.
@NicolBolas, если a
не является inline
, то он может быть определен только ровно в одном из файлов file1.cpp и file2.cpp, он должен быть объявлен extern
в другом. В каком бы файле он ни был объявлен extern
, у меня явно нет гарантии порядка инициализации.
@user17732522 user17732522 Спасибо за комментарий - я отредактировал, чтобы отразить это.
Да, это гарантировано.
https://en.cppreference.com/w/cpp/language/initialization#Dynamic_initialization
Частично упорядоченная динамическая инициализация, которая применяется ко всем встроенным переменным, которые не являются явно или неявно созданными экземплярами специализации. Если частично упорядоченный V определен перед упорядоченным или частично упорядоченным W в каждой единице трансляции, инициализация V выполняется до инициализации W (или происходит раньше, если программа запускает поток).
Упорядоченная динамическая инициализация, которая применяется ко всем другим нелокальным переменным: в пределах одной единицы трансляции инициализация этих переменных всегда выполняется в точном порядке, в котором их определения появляются в исходном коде. Инициализация статических переменных в разных единицах трансляции выполняется в неопределенной последовательности. Инициализация локальных переменных потока в разных единицах трансляции не упорядочена.
(жирный мой)
«Гарантированно ли, что a инициализируется перед b и c, что приводит к b == 12 и c == 10?» Я не уверен, что понимаю вопрос. Разве это не было бы гарантировано, даже если бы
a
не былоinline
?