Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2313806
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: 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"
#include

Foo & x_foo = GetFoo();
int main()
{
    x_foo.print();
    puts(__FUNCSIG__);
    return 0;
}

阅读(7024) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~