静态变量初始化顺序

静态变量初始化顺序

C+保证编译单元(.cpp文件)中的变量按声明顺序初始化。对于编译单元的数量,这条规则分别适用于每个编译单元(我指的是类之外的静态变量)。

但是,变量的初始化顺序在不同的编译单元之间没有定义。

关于GCC和MSVC的订单,我在哪里可以看到一些解释?(我知道,依赖这是一个非常糟糕的想法-这仅仅是为了了解我们在迁移到新GCC专业和不同操作系统时,遗留代码可能存在的问题)?


千巷猫影
浏览 839回答 3
3回答

月关宝盒

正如您所说,顺序在不同的编译单元之间没有定义。在同一个编译单元中,顺序被很好地定义:与定义相同的顺序。这是因为这不是在语言级别上解决的,而是在链接器级别上解决的。所以你真的需要查看链接器文档。虽然我真的怀疑这在任何有用的方面都会有帮助。GCC:请看LD我已经发现,即使更改对象文件被链接的顺序也会改变初始化顺序。因此,您需要担心的不仅仅是链接器,还包括构建系统如何调用链接器。甚至试图解决这个问题实际上也是不可能的。这通常只是在初始化过程中相互引用的全局值时才出现的问题(因此只影响带有构造函数的对象)。有一些技巧可以解决这个问题。延迟初始化。施瓦兹计数器将所有复杂的全局变量放在同一个编译单元中。注1:全球:用于引用以前可能初始化的静态存储持续时间变量。main().注2:可能在一般情况下,我们期望在main之前初始化静态存储持续时间变量,但在某些情况下允许编译器延迟初始化(规则很复杂,参见标准的详细信息)。
打开App,查看更多内容
随时随地看视频慕课网APP