sha*_*oth 12 c++ static namespaces initialization
全局变量按照出现在翻译模块中的顺序以及未指定的不同翻译模块中的变量初始化的相对顺序(所谓的"静态初始化顺序惨败")进行初始化.
名称空间对此有影响吗?例如,如果我有这个代码:
//first.cpp
int first;
int second;
Run Code Online (Sandbox Code Playgroud)
与此代码相比,初始化顺序是否有任何差异:
//second.cpp
namespace {
int first;
}
int second;
Run Code Online (Sandbox Code Playgroud)
是否存在将全局对象放入命名空间会影响初始化顺序的情况?
Pub*_*bby 11
3.6具有静态存储持续时间的其他非局部变量已经有序初始化.在单个翻译单元中定义的有序初始化的变量应按其在翻译单元中的定义顺序进行初始化.
命名空间对此没有影响 - 本节未提及.
什么影响订单是不同的翻译单位.如果您需要在它们之间定义顺序,请使用扩展名,例如GCC的constructor属性.
那么,"全局变量按照出现在翻译模块中的顺序进行初始化"是明确的.它不会留下任何其他任何空间,如命名空间,以影响订单.
实际上,"全局变量按顺序初始化......"是标准的不精确引用,因为这是正式错误的.C++标准,ISO/IEC 14882:2003,3.6.2第1段的确切措辞是:
在同一翻译单元的命名空间范围内定义并动态初始化的静态存储持续时间的对象应按其定义出现在翻译单元中的顺序进行初始化.
因此,不是"全局"它表示"使用静态存储",这是所有非本地变量,无论它们是全局变量,命名空间成员还是类成员,以及它们是否被声明static.
它还增加了"动态初始化".具有普通构造函数和常量初始值设定项的变量总是首先初始化(通过简单地从二进制加载它们的值),并且评估所有非常量初始化程序,并且按顺序运行非平凡构造函数.这很重要,因此您可以在这些构造函数中可靠地创建链接列表; 如果它的头是普通指针,它已经初始化,所以你可以安全地使用它.
| 归档时间: |
|
| 查看次数: |
1263 次 |
| 最近记录: |