【发布时间】:2011-04-14 08:37:02
【问题描述】:
我认为我的问题最好用代码来描述:
#include <stdio.h>
struct Foo;
extern Foo globalFoo;
struct Foo {
Foo() {
printf("Foo::Foo()\n");
}
void add() {
printf("Foo::add()\n");
}
static int addToGlobal() {
printf("Foo::addToGlobal() START\n");
globalFoo.add();
printf("Foo::addToGlobal() END\n");
return 0;
}
};
Foo globalFoo;
int dummy = Foo::addToGlobal();
int main() {
printf("main()\n");
return 0;
}
以上打印(使用 gcc 4.4.3):
Foo::Foo()
Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
main()
这是我所期望的,并且看起来合乎逻辑。
但是,当我交换以下行时:
Foo globalFoo;
int dummy = Foo::addToGlobal();
进入这个:
int dummy = Foo::addToGlobal();
Foo globalFoo;
程序输出以下内容:
Foo::addToGlobal() START
Foo::add()
Foo::addToGlobal() END
Foo::Foo()
main()
似乎Foo 的实例方法正在使用尚未构造的实例调用!像在全局范围内移动变量声明这样简单的事情正在影响程序的行为,这让我相信(1)未定义全局变量的初始化顺序和(2)全局变量的初始化顺序忽略所有依赖项。它是否正确?是否可以确保在初始化dummy之前调用Foo的构造函数?
我要解决的问题是静态填充项目存储库(Foo 的静态实例)。在我当前的尝试中,我正在使用一个宏(除其他外)创建一个全局变量(在匿名命名空间中以避免名称冲突),其初始化会触发静态初始化。也许我从错误的角度解决了我的问题?有更好的选择吗?谢谢。
【问题讨论】:
标签: c++