ここでは、 Which header ?の下に次のステートメントがあります。:
最後に
<iostream>
、8 つの標準グローバル オブジェクト (cin、cout など) を提供します。これを正しく行うために、このヘッダーは<istream>
および<ostream>
ヘッダーの内容も提供しますが、他には何も提供しません。このヘッダーの内容は次のようになります
#include <ostream>
#include <istream>
namespace std
{
extern istream cin;
extern ostream cout;
....
// this is explained below
static ios_base::Init __foo; // not its real name
}
ここで、前述のランタイム ペナルティがあります。グローバル オブジェクトは、独自のコードで使用する前に初期化する必要があります。これは標準で保証されています。他のグローバル オブジェクトと同様に、一度だけ初期化する必要があります。これは通常、上記のような構造で行われ、ネストされたクラス ios_base::Init が標準で指定されているのは、まさにこの理由からです。
それはどのように機能しますか?ヘッダーはどのコードよりも前にインクルードされるため、__foo オブジェクトはどのオブジェクトよりも前に構築されます。(グローバル オブジェクトは、宣言された順序で構築され、逆の順序で破棄されます。) コンストラクタが最初に実行されると、8 つのストリーム オブジェクトが設定されます。
私の質問: ヘッダー ファイル<iostream>
を複数のファイルに含める場合、上記のスキームは、オブジェクト、などの定義が1 つだけ.cpp
であることをどのように保証しますか?cin
cout