これはからのもの<iostream>
です:
namespace std
{
extern istream cin; ///< Linked to standard input
extern ostream cout;
...
他の名前空間で定義されたデータ型を使用extern
することで、利用できるようになりますか?
extern
「これらの変数は、他のコンパイル単位 (.cpp または .lib ファイル) で定義されている」ことを意味します
この場合、あなた#include <iostream>
は .cpp ファイルに入り、cin
とcout
が として宣言されているためextern
、コンパイラは文句を言わずにそれらを使用できるようにします。次に、リンカーが実行されると、すべてのextern
変数が検索され、すべてが並べ替えられます。
extern
別のコンパイル単位で定義された変数を参照するために使用されます (現時点では、コンパイル単位を .cpp ファイルと考えることができます)。あなたの例のステートメントは、定義するのではなく宣言し、. これらのオブジェクトの定義が別のコンパイル単位で見つかったことをコンパイラに伝えています (ここでは、として宣言されていません)。 cin
cout
extern
いいえ、これは明示的な言い方であり、cin
実際cout
に定義せずに宣言されています。
externキーワードは、変数が別のソース (つまり、現在のスコープ外) で宣言されていることをコンパイラに伝えます。次に、リンカーはこの実際の宣言を見つけて、正しい場所を指すようにextern変数を設定します。
externステートメントで宣言された変数には、他の場所で適切に定義する必要があるため、それらに割り当てられるスペースはありません。変数がexternと宣言されていて、リンカーがその実際の宣言を検出しない場合、エラーが表示されます。
例えば。extern int i;
//これは、プログラム内のどこかで定義された int 型の i という名前の変数があることを宣言します。