C++ 不同翻译单元中的变量初始化
假设我们有两个翻译单元:C++ 不同翻译单元中的变量初始化,c++,initialization,C++,Initialization,假设我们有两个翻译单元: //--a.cpp--// int a; int b; int c; int main(){ } //--b.cpp--// int d; int e; int f; 该程序不启动线程。因此(3.6.2/2) 变量的初始化以不确定顺序排列 关于在不同类型中定义的变量的初始化 翻译股 这是否意味着只有在初始化一个翻译单元中的所有变量(例如b.cpp)之后,实现才会开始初始化另一个翻译单元中的变量(a.cpp)?翻译单元中全局变量的初始化是按定义顺序进行的,因
//--a.cpp--//
int a;
int b;
int c;
int main(){ }
//--b.cpp--//
int d;
int e;
int f;
该程序不启动线程。因此(3.6.2/2)
变量的初始化以不确定顺序排列
关于在不同类型中定义的变量的初始化
翻译股
这是否意味着只有在初始化一个翻译单元中的所有变量(例如
b.cpp
)之后,实现才会开始初始化另一个翻译单元中的变量(a.cpp
)?翻译单元中全局变量的初始化是按定义顺序进行的,因此a、b、c
和d、e、f
但是如果它是a、b、c
然后是d、e、f
或者如果它是相反的,则它是未指定的
或者甚至以交错的顺序(比如,
a、d、b、c、e、f
),尽管我认为大多数实现将从一个翻译单元在一行中初始化所有全局变量,所以除了多线程之外,我认为在实践中不会发生这种情况。不,不确定顺序表示它们以某种顺序出现,但未指定顺序。一个转换单元中的变量将在另一个转换单元中的变量之前或之后初始化。为什么不能像a、d、b、c、e、f那样交错初始化?@dyp:我认为这是标准明确允许的。但除了多线程之外,我看不出实现会这样做的任何理由。无论如何,我会将其添加到答案中。当程序生成另一个线程时,初始化将取消顺序。如果多个线程在不同的TU中同时初始化变量,则不确定序列将需要一些同步机制。事实上,我已经查找了类似示例的a、d、b、c、e、f。非常感谢。:)您是否暗示一个TU中的整套初始化是在另一个TU中的整套初始化之前或之后完成的?见我对/和罗德里戈的回答的评论。