2011-09-28 101 views
1

下面的代码是否安全(不保证静态初始化顺序?)。静态初始化在依赖关系的情况下

在一些图书馆:

class A { 
    A() : x_ = 0 { 
    } 

    int add() { 
     return ++x_; 
    } 
}; 

namespace S { 
    static A a_; 
} 

#define ADD(varname) \ 
    namespace S { \ 
     static int v_##varname = a_.add(); \ 
    } 

宏添加将在多个地方使用。是否保证在v_ ## varname之前为任何ADD宏使用情况初始化a_?

+0

你是什么意思安全 - 这是否甚至编译? –

回答

2

没有为你的情况下常用的技巧,如果你想保证:

namespace S { 

A & getA() { 
    static A a; 
    return a; 
} 

} // namespace S 

而且

static int v_name = getA().add(); 
+0

请注意,在某些情况下,这可能会导致静态破坏问题。 –

0

同一翻译单元/源文件只ADD之后的任何用途a_的定义将在构建a_后执行。在任何其他翻译单位(图书馆或应用程序)中,所有投注都按照初始化顺序关闭。

如果需要,您可以使用静态本地方法之一。

参见常见问题解答:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15

相关问题