2011-09-28 63 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

相關問題