c++ - 静态全局变量初始化顺序
问题描述
在我在这里找到的许多答案中,都说了以下的话:
单个翻译单元(源文件)中的全局变量按照定义的顺序进行初始化。
或者
在同一个编译单元中,顺序是明确定义的:与定义相同的顺序。
等等
但是在 C++ 的标准中我在哪里可以看到这些词呢?我想得到一个或几个具体的段落来描述这种行为。我自己找不到,也不知道该问谁。
解决方案
6.6.3 非局部变量的动态初始化[ basic.start.dynamic ]
- 如果变量是隐式或显式实例化的特化,则具有静态存储持续时间的非局部变量的动态初始化是无序的,如果变量是不是隐式或显式实例化的特化的内联变量,则它是部分排序的,否则是有序的. [注意:显式特化的非内联静态数据成员或变量模板特化已排序初始化。——尾注]
- 具有静态存储持续时间的非局部变量 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] 小节。
推荐阅读
- sql - SQL Server 比较 (dev) 表列内容与 (prod) 表列内容
- r - R中的右对齐列
- mysql - 无法获取日期时间小于系统日期的记录
- ios - 视觉框架:在跟踪用户的面部时,如何让图像(如帽子)与面部同步移动?
- javascript - javascript密码输入验证启动模式
- sql - 如何通过查询获取 SQL 表外键类型
- angular - 如何在Angular 6的OwlDateTime中设置手动输入的日期
- javascript - 如何避免在 javascript for 循环中重复代码?
- c# - Selenium - 调用项目 DLL 来运行测试用例 c# 问题
- javascript - 如何使用 CDN 在 Vue.js 中包含外部模板?