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