4

Scott Meyer の効果的な C++ の本を読んでいます。その中で彼は、異なる翻訳単位における非ローカル静的オブジェクトの相対的な順序は未定義であると述べています。実証するために、彼は次の例を挙げました。1つのファイルで、

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

ただし、初期化順序が不定である理由がわかりません。特に、翻訳単位が 2 つある理由。を 2 番目のファイルで使用するにはtfs、最初のファイルを含める必要はないので、両方のファイルを同じ翻訳単位に入れますか?

だから私の質問:私が言ったことの何が問題なのか、または初期化順序が原因で問題を引き起こす可能性のある異なる翻訳単位で相互作用する静的な非ローカルオブジェクトの別の例は何ですか?

4

1 に答える 1

3

tfs最初のファイルには、 の定義ではなく、 の宣言のみがあることに注意してください (externキーワードを使用しています)。

これtfsは、 が別の翻訳単位で定義されていることを意味するため、初期化順序が指定されていません。

于 2013-03-29T11:18:55.217 に答える