首页 > 解决方案 > 静态全局变量初始化顺序

问题描述

在我在这里找到的许多答案中,都说了以下的话:

单个翻译单元(源文件)中的全局变量按照定义的顺序进行初始化。

或者

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

等等

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

标签: c++initializationglobal-variableslanguage-lawyeroperator-precedence

解决方案


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

  1. 如果变量是隐式或显式实例化的特化,则具有静态存储持续时间的非局部变量的动态初始化是无序的,如果变量是不是隐式或显式实例化的特化的内联变量,则它是部分排序的,否则是有序的. [注意:显式特化的非内联静态数据成员或变量模板特化已排序初始化。——尾注]
  2. 具有静态存储持续时间的非局部变量 V 和 W 的动态初始化顺序如下:
    • 如果 V 和 W 已有序初始化,并且 V 在单个翻译单元中定义在 W 之前,则 V 的初始化在 W 的初始化之前排序。
    • 如果 V 具有部分有序初始化,W 没有无序初始化,并且在定义 W 的每个翻译单元中,V 在 W 之前定义,则
      • 如果程序启动主线程(6.6.1)以外的线程(4.7),V的初始化强烈发生在W的初始化之前;
      • 否则,V 的初始化在 W 的初始化之前排序。
    • 否则,如果程序在初始化 V 或 W 之前启动了主线程以外的线程,则未指定 V 和 W 的初始化发生在哪个线程中;如果它们发生在同一个线程中,则初始化是无序的。
    • 否则,V 和 W 的初始化是不确定的。

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

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


推荐阅读