我正在阅读 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,是否必须包含第一个文件,因此将两个文件放在同一个翻译单元中?

所以我的问题是:我刚才所说的有什么问题,或者静态非本地对象在不同翻译单元中交互的另一个例子是什么,这可能会因初始化顺序而导致问题?

最佳答案

请注意,在第一个文件中,只有 tfs 的声明,而不是其定义(它使用 extern 关键字)。

这意味着 tfs 在不同的翻译单元中定义,因此未指定初始化顺序。

关于c++非本地静态对象在不同翻译单元中交互的例子,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15702139/

10-08 22:25