【问题标题】:Static variable initialization - clarification静态变量初始化 - 说明
【发布时间】:2016-04-17 19:28:46
【问题描述】:

我在另一个类中有一个类的静态变量。

class1.h

class1
{
public:
static class2 check;
}

class2.cpp
class2 class1::check;

现在 class2.cpp 具有以下默认构造函数

class2()
{
  size = G_SIZE; //this G_SIZE is an extern variable, which gets initialized after main() is called.
}

由于静态初始化发生在 extern 变量初始化之前,我将 0 初始化为 size。我该如何处理?

编辑:不知道为什么它被否决。

【问题讨论】:

  • 没有完全理解你 - 这里有什么问题?
  • class2 默认构造函数在静态成员初始化期间被调用,这发生在调用 main 之前。因此,大小变量不会用我想要的值 (G_SIZE) 进行初始化。因为 G_SIZE 只有在 main() 被调用后才会得到它的值。如何使用正确的值初始化大小。
  • G_SIZE 被初始化之前 main 被调用,class1::check 也是如此。如果变量是在不同的翻译单元中定义的,那么这些初始化的顺序是未指定的。
  • @molbdnilo: "G_SIZE 在调用main 之前被初始化" 嗯?你怎么知道的?看起来 OP 滥用“初始化”来表示第一次分配,但除此之外,除了按照他们的话来接受 OP 之外,没有办法知道这种情况何时发生。 minimal reproducible example 会很好。
  • @molbdnilo 我错过了一个信息,G_SIZE 是从文件中读取的,因此它在 main() 之后调用。但是,我明白你的意思。

标签: c++ static


【解决方案1】:

您不应该让静态变量依赖于其他变量(尤其是其他静态变量)。但这正是你正在做的事情。

第一个建议:不要这样做。寻找更好的设计。

下一个建议:如果你必须这样做(在这种情况下,你肯定不会这样做),你可以将你的访问包装在一个函数中,它会延迟到运行时,当值保证被设置。见这里:What is the lifetime of a static variable in a C++ function? 和这里:C++ static initialization order

【讨论】:

    【解决方案2】:

    通过告诉编译器“静态” - 您很可能会在 mainCRTstartup 期间初始化该变量 - 那是在调用 main 之前。如果您在 main 期间执行变量初始化,则必须在此之后进行其他数据初始化 - 您可以使用 doInitialize() 之类的函数调用,这将执行您的“检查”变量的初始化。

    也可以将静态写入函数本身 - 然后在调用该函数时初始化静态 - 您可以在 main 本身初始化 G_SIZE 后放置“静态”。

    玩弄顺序或构造函数/析构函数总是有点运气游戏(危险) - 不能保证构造函数和析构函数的顺序,并且在静态初始化时可能会遇到未初始化的数据 - 仅仅因为另一个变量是尚未初始化。

    但有时甚至可能需要更改析构函数的调用顺序。 -

    FYI:
    http://www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI
    CrtDestroyStatics.
    

    【讨论】:

      猜你喜欢
      • 2011-08-22
      • 2010-12-22
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多