分类: C/C++
2012-06-01 15:46:34
用代码说话:
static Foo g_foo;
Foo & GetFoo()
{
puts(__FUNCSIG__);
return g_foo;
}
GetFoo 函数被调用时, g_foo 能保证已被正确地初始化了吗?
相比与一般性的忠告: 跨编译单元的静态对象初始化顺序不确定.
这个问题更加诡异, 因为我已经说了诡异, 所以你可能猜: 不能保证g_foo先于函数被调用而被初始化.
因为这是在同一个编译单元中, 所以以普通人直觉, 先出现者先初始化, 但这里的情况是: 函数 GetFoo是一个函数, 而这个函数被调用的时机不是该编译单元本身所能决定的. 比如在另一个编译单元中, 为了定义一个全局的Foo & 变量而调用了这个函数, 还能保证这里的g_foo与 GetFoo的先后顺序吗?
下面把完整的代码贴出来, 可以简单地在VC下验证:
cl main.cpp foo.cpp && main
foo.h
#include
struct Foo {
int i ;
Foo()
{
puts(__FUNCSIG__);
}
void print()
{
puts(__FUNCSIG__);
}
};Foo & GetFoo();
foo.cpp
#include "foo.h"
static Foo g_foo;
Foo & GetFoo()
{
puts(__FUNCSIG__);
return g_foo;
}
main.cpp
#include "foo.h"
#includeFoo & x_foo = GetFoo();
int main()
{
x_foo.print();
puts(__FUNCSIG__);
return 0;
}