c++ - 静态变量初始化顺序

标签 c++ visual-studio gcc static linker

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

但是,变量的初始化顺序在不同的编译单元中是不确定的。

我在哪里可以看到关于 gcc 和 MSVC 的这个顺序的一些解释(我知道依赖那个是一个非常糟糕的主意 - 它只是为了理解我们在转移到新的 GCC 主要和不同的操作系统)?

最佳答案

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

在同一编译单元内,顺序定义明确:与定义相同的顺序。

这是因为这不是在语言级别而是在链接器级别解决的。所以你真的需要查看链接器文档。尽管我真的怀疑这会以任何有用的方式提供帮助。

对于 gcc:查看 ld

我发现即使改变被链接的目标文件的顺序也会改变初始化顺序。因此,您需要担心的不仅仅是您的链接器,还有您的构建系统如何调用链接器。即使尝试解决问题实际上也是行不通的。

这通常只是在初始化全局变量时出现问题,这些全局变量在它们自己的初始化过程中相互引用(因此只影响具有构造函数的对象)。

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

  • 延迟初始化。
  • Schwarz Counter
  • 将所有复杂的全局变量放在同一个编译单元中。

  • 注1:全局变量:
    松散地用于指代可能在 main() 之前初始化的静态存储持续时间变量。
  • 注2:可能
    在一般情况下,我们希望静态存储持续时间变量在 main 之前初始化,但在某些情况下允许编译器延迟初始化(规则很复杂,详见标准)。

关于c++ - 静态变量初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24703179/

相关文章:

c# - Windows XP下Visual Studio 2013远程调试过程

c++ - 在使用 Visual Studio 2005 调试时调用函数?

无法配置c编译器

c++ - 需要有关在 gcc-7.2.0 中有编译错误但在 gcc-6.4.0 中没有的代码的帮助

c++ - 如何更改automake的CXXLINK中的顺序?

python - 在 boost::odeint 中指定插值时间

c++ - 访问静态 constexpr float 成员时 undefined reference

c++ - 如何返回空终止的 const char* vector ?

c++ - 创建一组宏来定义一个名为 RETURN_STATUS 的类型和以下值 :

c# - 霍纳算法