静态全局变量初始化顺序

时间:2019-01-12 11:13:23

标签: c++ initialization global-variables language-lawyer operator-precedence

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

  

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

  

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

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

1 个答案:

答案 0 :(得分:7)

  

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

     
      
  1. 非本地的动态初始化   如果变量为静态,则具有静态存储持续时间的变量是无序的   隐式或显式实例化的专业化是   如果变量是不是一个内联变量的部分排序   隐式或显式实例化的专业化,否则为   下令。 [注意:显式专门化的非内联静态数据   成员或变量模板专门化已命令初始化。   —尾注]
  2.   
  3. 非局部变量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的初始化顺序不确定。
    •   
  4.   

引自N4659,格式经过了调整,可以与此处支持的降价一起使用。

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