在我在这里找到的许多答案中,都说了以下几个字:
单个翻译单元(源文件)中的全局变量按照定义顺序进行初始化。
或
在相同的编译单元中,顺序已明确定义:与定义相同的顺序。
等
但是在C ++标准中我在哪里可以看到这些词?我想获得描述这种行为的一个或几个具体段落。我自己找不到,也不知道问谁。
答案 0 :(得分:7)
6.6.3动态初始化非局部变量[basic.start.dynamic]
- 非本地的动态初始化 如果变量为静态,则具有静态存储持续时间的变量是无序的 隐式或显式实例化的专业化是 如果变量是不是一个内联变量的部分排序 隐式或显式实例化的专业化,否则为 下令。 [注意:显式专门化的非内联静态数据 成员或变量模板专门化已命令初始化。 —尾注]
- 非局部变量V和W的动态初始化 具有静态存储持续时间的顺序如下:
- 如果V和 W已排序初始化,并且V在A中的W之前定义 单个翻译单元,V的初始化先于 W的初始化。
- 如果V 具有部分有序的初始化,W没有无序 初始化,并且在每个翻译单元中的W之前定义V 定义哪个W,然后
- 如果程序启动了线程 (4.7)除主线程(6.6.1)外,初始化V 强烈发生在W初始化之前;
- 否则, V的初始化先于W的初始化进行。
- 否则,如果程序启动了除main以外的线程 在初始化V或W之前的线程,未指定 线程发生V和W的初始化;初始化是 如果它们出现在同一线程中,则不排序。
- 否则, V和W的初始化顺序不确定。
引自N4659,格式经过了调整,可以与此处支持的降价一起使用。
有关动态初始化的确切定义,请参见前面的第6.6.2节[basic.start.static]。