【问题标题】:Affect the order of initialization in C++影响 C++ 中的初始化顺序
【发布时间】:2018-05-21 09:54:16
【问题描述】:

在阅读《Thinking in Java》一书时,我发现了这一行

例如,C++ 有问题,如果一个静态期望另一个静态 在第二个初始化之前有效

随后我尝试通过以下code 确定自己:

class A{
    public:
        static int x;
};
int A::x = B::y; //error 'B' has not been declared
class B{
    public:
        static int y;
};
int B::y = 10;
int main()
{
    return 0;
}

我的问题是有没有办法克服这个问题。 Java 通过在访问静态字段/方法时加载类代码来处理此问题。我们如何在 C++ 中做到这一点?

【问题讨论】:

  • 你在这里混用了术语。这本书谈到了静态初始化顺序惨败(导致运行时未定义的行为)。您的验证在一个文件中处理申报顺序,与 SIFO 无关。
  • 好的。明白你的意思。仍然很想知道上述代码的解决方法。感谢您指出。

标签: c++ compiler-errors static initialization


【解决方案1】:

A::x的初始化必须放在B的定义之后,B::y的使用必须是完整的类型;并且在B::y初始化之后,因为A::x是从它初始化的。

例如

class B{
    public:
        static int y;
};
int B::y = 10;

class A{
    public:
        static int x;
};
int A::x = B::y;

initialization order 指定如下:

有序动态初始化,适用于所有其他非局部变量:在单个翻译单元内,这些变量的初始化始终按照它们在源代码中的定义出现的确切顺序进行排序。不同翻译单元中静态变量的初始化是不确定的。不同翻译单元中线程局部变量的初始化是无序的。

【讨论】:

    【解决方案2】:

    答案是否定的,你必须以正确的顺序初始化你的静态成员变量。

    如果是const,可以直接在类中初始化。

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多