C++ 保证编译单元(.cpp 文件)中的变量按声明顺序初始化。对于编译单元的数量,此规则分别适用于每个编译单元(我指的是类外的静态变量)。
但是,变量的初始化顺序在不同的编译单元中是不确定的。
我在哪里可以看到关于 gcc 和 MSVC 的这个顺序的一些解释(我知道依赖那个是一个非常糟糕的主意 - 它只是为了理解我们在转移到新的 GCC 主要和不同的操作系统)?
最佳答案
正如您所说,不同编译单元之间的顺序未定义。
在同一编译单元内,顺序定义明确:与定义相同的顺序。
这是因为这不是在语言级别而是在链接器级别解决的。所以你真的需要查看链接器文档。尽管我真的怀疑这会以任何有用的方式提供帮助。
对于 gcc:查看 ld
我发现即使改变被链接的目标文件的顺序也会改变初始化顺序。因此,您需要担心的不仅仅是您的链接器,还有您的构建系统如何调用链接器。即使尝试解决问题实际上也是行不通的。
这通常只是在初始化全局变量时出现问题,这些全局变量在它们自己的初始化过程中相互引用(因此只影响具有构造函数的对象)。
有一些技术可以解决这个问题。
- 延迟初始化。
- Schwarz Counter
- 将所有复杂的全局变量放在同一个编译单元中。
- 注1:全局变量:
松散地用于指代可能在main()
之前初始化的静态存储持续时间变量。 - 注2:可能
在一般情况下,我们希望静态存储持续时间变量在 main 之前初始化,但在某些情况下允许编译器延迟初始化(规则很复杂,详见标准)。
关于c++ - 静态变量初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24703179/