静态全局变量初始化顺序

adz*_*iri 4 c++ initialization global-variables operator-precedence language-lawyer

在我在这里找到的许多答案都说了以下几个字:

单个转换单元(源文件)中的全局变量按其定义的顺序初始化.

要么

在同一个编译单元中,订单定义明确:与定义相同的顺序.

等等

但是我在哪里可以看到C++标准中的这些词?我想得到一个或几个具体的段落,其中描述了这种行为.我自己找不到,我不知道该问谁.

Bau*_*gen 7

6.6.3非局部变量的动态初始化[ basic.start.dynamic ]

  1. 如果变量是隐式或显式实例化的特化,则动态初始化具有静态存储持续时间的非局部变量是无序的,如果变量是不是隐式或显式实例化的特化的内联变量,则是部分排序的,否则是有序的.[注意:明确专门的非内联静态数据成员或变量模板特化已经订购了初始化. - 结束说明]
  2. 具有静态存储持续时间的非局部变量V和W的动态初始化按如下顺序排序:
    • 如果V和W在单个转换单元中有序初始化并且在W之前定义了V,则在初始化W之前对V的初始化进行排序.
    • 如果V具有部分有序的初始化,则W没有无序初始化,并且在定义了W的每个转换单元中在W之前定义V,然后
      • 如果程序启动主线程(6.6.1)以外的线程(4.7),则V的初始化强烈发生在W的初始化之前;
      • 否则,在初始化W之前对V的初始化进行排序.
    • 否则,如果程序在初始化V或W之前启动除主线程之外的线程,则未指定V和W的初始化发生在哪些线程中; 如果它们出现在同一个线程中,则初始化是未排序的.
    • 否则,V和W的初始化是不确定的.

引自N4659,格式调整为与此处支持的降价一起使用.

有关动态初始化的确切定义,请参见前面的第6.6.2节[basic.start.static].

  • 为了完整性.问题的标题,静态链接不会改变初始化行为. (3认同)