Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 请求提供“的详细说明”;静态初始化命令失败“;_C++_Static Initializer - Fatal编程技术网

C++ 请求提供“的详细说明”;静态初始化命令失败“;

C++ 请求提供“的详细说明”;静态初始化命令失败“;,c++,static-initializer,C++,Static Initializer,我在FAQLite中读到了关于SIOF的内容,但我真的不明白为什么会发生这个问题。我有一个静态库(.a),我使用该库来使用其静态常量数据成员对象类型。然后,我使用静态常量数据成员对象类型并将其分配给全局变量(对象)。但当我将全局变量用于main或任何局部函数时,它似乎是空的。很明显,我知道我的问题是SIOF,但我真的不明白为什么我的静态常量数据成员对象没有初始化 它是静态库,所以我猜当我们创建静态库时,静态const数据成员对象被编译并链接到该静态库,如果我错了,请纠正我 //libsource

我在FAQLite中读到了关于SIOF的内容,但我真的不明白为什么会发生这个问题。我有一个静态库(.a),我使用该库来使用其静态常量数据成员对象类型。然后,我使用静态常量数据成员对象类型并将其分配给全局变量(对象)。但当我将全局变量用于main或任何局部函数时,它似乎是空的。很明显,我知道我的问题是SIOF,但我真的不明白为什么我的静态常量数据成员对象没有初始化

它是静态库,所以我猜当我们创建静态库时,静态const数据成员对象被编译并链接到该静态库,如果我错了,请纠正我

//libsource.h
class foo
{
   public:
   ....

   public:
   static const barbar foofaa;
};

//libsource.cpp
const barbar foo::foofaa = barbar();

//main.cpp
#include <libsource.h>

barbar foos= foo::foofaa;

int main()
{
   //can't use foos because its empty
}
//libsource.h
福班
{
公众:
....
公众:
静态常数BarbarFoofaa;
};
//libsource.cpp
const barbar foo::foofaa=barbar();
//main.cpp
#包括
BarbarFoos=foo::foofaa;
int main()
{
//无法使用foos,因为它是空的
}
请给我一些建议。为什么静态常量数据成员对象即使在静态库中也没有初始化


非常感谢。

静态初始化顺序的失败相当简单:单个翻译单元中的静态对象按照声明的顺序初始化,但无法保证不同翻译单元中的静态对象相对于彼此的初始化顺序


因此,在您的特定示例中,
main.cpp
中的
foos
可能在
foo::foofaa
之前初始化,这在
libsource.cpp
中声明,谢谢。初始化部分对我来说真的很模糊。为什么需要初始化静态数据成员?当我们编译并链接以创建静态库时,它是否已经初始化?请给我一些建议。Thanks@sasayins:在运行程序之前,静态变量不会初始化。它们不是坐在静态库中等待使用的“预初始化”的地方。因此,当您的程序开始时(在调用
main()
之前),它会初始化每个库中的所有静态变量。@JaredC:更准确地说,一些静态变量是在编译或链接时预先初始化的,但其他静态变量(非普通变量)通常需要运行时初始化。编译器通常为它构建的每个对象创建一个初始化函数,然后在main()启动之前调用它们,但问题是这些初始化函数的调用顺序可能不是程序所需要的。事实上,如果您有循环依赖关系,那么哪一个先运行可能并不重要——它仍然会被破坏。FAQ lite继续提供一些解决方法。。。。