静态变量初始化 - 澄清

时间:2016-04-17 19:28:47

标签: c++ static

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

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。我该如何处理?

编辑:不确定为什么会被投票。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

也可以在函数内部使用静态写入 - 然后在调用该函数时初始化静态 - 你可以放置静态'在main中初始化G_SIZE之后。

使用命令或构造函数/析构函数总是运气不好(危险) - 对构造函数和析构函数的命令不能保证,并且在初始化静态时你可能会击中未初始化的数据 - 只是因为另一个变量尚未初始化。

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

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