【发布时间】:2012-08-15 01:16:33
【问题描述】:
我对从这段代码中得到的结果感到困惑。在一个 dll 中,当初始化静态变量时,计数器会递增。然后当 main 执行时,我读取了这个计数器,但我得到的是 0 而不是 1。有人可以向我解释一下吗?
在我的动态库项目中:
// Header file
class Foo {
int i_ = 0;
Foo(const Foo&) = delete;
Foo& operator= (Foo) = delete;
Foo()
{
}
public:
void inc()
{
++i_;
}
int geti()
{
return i_;
}
static Foo& get()
{
static Foo instance_;
return instance_;
}
Foo( Foo&&) = default;
Foo& operator= (Foo&&) = default;
};
int initialize()
{
Foo::get().inc();
return 10;
}
class Bar
{
static int b_;
};
// cpp file
#include "ClassLocalStatic.h"
int Bar::b_ = initialize();
在我的应用项目中
// main.cpp
#include <iostream>
#include "ClassLocalstatic.h"
int main(int argc, const char * argv[])
{
std::cout << Foo::get().geti();
return 0;
}
【问题讨论】:
-
尝试查找静态订单初始化惨败
-
我刚试过这个,它给了我 1。也许你不应该依赖静态初始化顺序......
-
@Antimony 我认为情况并非如此。因为在这种情况下定义的顺序......当 Bar::b_ 被初始化时,它将实例化 Foo 并增加计数器。这将在 main 之前发生。它确实如此,但问题是在主 Foo::get() 中实际上创建了一个新的 Foo,与在 initialize() 中创建的不同。那是我不明白的。另请注意,如果所有这些代码都是同一个库,则输出为 1。
-
@Henry Hu 我不依赖于初始化顺序。它是在这种情况下定义的。您确定您在另一个项目中使用 lib 和 main 中的代码进行了测试吗?我可能怀疑 Xcode 中存在错误,但我真的很怀疑......
-
@monamimani 我将第一个 .h 和 .cpp 编译成 .so,然后将第二个编译成与库链接的可执行文件。