为了账号安全,请及时绑定邮箱和手机立即绑定

静态变量初始化顺序

静态变量初始化顺序

C++
千巷猫影 2019-07-27 15:15:47
静态变量初始化顺序C+保证编译单元(.cpp文件)中的变量按声明顺序初始化。对于编译单元的数量,这条规则分别适用于每个编译单元(我指的是类之外的静态变量)。但是,变量的初始化顺序在不同的编译单元之间没有定义。关于GCC和MSVC的订单,我在哪里可以看到一些解释?(我知道,依赖这是一个非常糟糕的想法-这仅仅是为了了解我们在迁移到新GCC专业和不同操作系统时,遗留代码可能存在的问题)?
查看完整描述

3 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

正如您所说,顺序在不同的编译单元之间没有定义。

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

这是因为这不是在语言级别上解决的,而是在链接器级别上解决的。所以你真的需要查看链接器文档。虽然我真的怀疑这在任何有用的方面都会有帮助。

GCC:请看LD

我已经发现,即使更改对象文件被链接的顺序也会改变初始化顺序。因此,您需要担心的不仅仅是链接器,还包括构建系统如何调用链接器。甚至试图解决这个问题实际上也是不可能的。

这通常只是在初始化过程中相互引用的全局值时才出现的问题(因此只影响带有构造函数的对象)。

有一些技巧可以解决这个问题。

  • 延迟初始化。
  • 施瓦兹计数器

  • 将所有复杂的全局变量放在同一个编译单元中。

  • 注1:全球:


    用于引用以前可能初始化的静态存储持续时间变量。

    main().

  • 注2:可能


    在一般情况下,我们期望在main之前初始化静态存储持续时间变量,但在某些情况下允许编译器延迟初始化(规则很复杂,参见标准的详细信息)。


查看完整回答
反对 回复 2019-07-28
  • 3 回答
  • 0 关注
  • 812 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信