我正在阅读Scott Meyer的Effective C ++书籍。在其中,他提到不同翻译单元中非本地静态对象的相对顺序是不确定的。为了证明,他给出了以下例子。在一个文件中,
class FileSystem {
public:
std::size_t numDisks() const;
};
extern FileSystem tfs;
在另一个档案中,
class Directory {
public:
Director() {
std::size_t disks = tfs.numDisks();
}
};
Directory tempDir();
我理解为什么如果初始化顺序不确定,这可能会很糟糕,因为tfs
在tempDir
调用其构造函数之前可能无法初始化tfs
。
但是,我不明白为什么初始化顺序是不确定的;特别是,为什么有两个翻译单元。要在第二个文件中使用{{1}},是否必须包含第一个文件,因此将两个文件放在同一个翻译单元中?
所以我的问题:我刚刚说过的内容有什么问题,或者是什么是静态非本地对象在不同翻译单元中交互的另一个例子,这可能会因初始化顺序而导致问题?
答案 0 :(得分:3)
请注意,在第一个文件中,只有tfs
的声明,而不是其定义(使用extern
关键字)。
这意味着tfs
在不同的翻译单元中定义,因此未指定的初始化顺序。