【问题标题】:static global variables initialization order静态全局变量初始化顺序
【发布时间】:2019-01-12 11:13:23
【问题描述】:

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

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

在同一个编译单元内,顺序是很好定义的:与定义相同的顺序。

等等

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

【问题讨论】:

  • 我很难相信这里没有线程引用这个。在这种情况下,这将是一个明显的重复,大概与许多其他链接到这样一个线程。也许有人需要编辑这样的规范线程以使其更易于搜索......

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我的寻标速度达不到标准。 +1。
  • 非常感谢,我想这就是我要找的:)
  • 为了完整性。问题的标题,静态链接不会改变初始化行为。
  • @Quentin 为了完整性,上述规则是否适用于静态初始化的变量?像 int a;或int b = 5; ?
  • @adziri 好吧,“静态初始化”相当于“在编译时烘焙”,所以问题是静态初始化的对象是否可以相互引用——如果不能,那么顺序是无关紧要,因为它们是独立的。
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2015-06-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多