2013-03-29 18 views
3

我正在閱讀Scott Meyer的Effective C++書籍。其中,他提到了不同翻譯單位中非本地靜態對象的相對順序是不確定的。爲了演示,他給出了下面的例子。在一個文件中,C++非局部靜態對象在不同翻譯單元中交互的示例

class FileSystem { 
    public: 
    std::size_t numDisks() const; 
}; 
extern FileSystem tfs; 

在另一個文件中,

class Directory { 
    public: 
    Director() { 
    std::size_t disks = tfs.numDisks(); 
    } 
}; 
Directory tempDir(); 

我明白了爲什麼這可能是壞的,如果初始化順序是不確定的,因爲tempDir調用它的構造函數之前tfs可能不被初始化。

但是,我不明白爲什麼初始化順序是不確定的;特別是爲什麼有兩個翻譯單元。對於tfs在第二個文件中使用,也不會第一個必須被包括在內,因此把兩個文件在同一個翻譯單元?

所以我的問題:有什麼問題我剛纔說的,或者什麼是靜態的非本地對象在不同的​​翻譯單元,其可能會由於初始化順序問題相互作用的一個例子嗎?

回答

2

請注意,在第一個文件中,只有tfs的聲明,而不是其定義(它使用extern關鍵字)。

這意味着tfs在不同的轉換單元中定義的,因此未指定的初始化順序。