extern ストレージ・クラス指定子により、 複数のソース・ファイルから使用できるオブジェクトと関数を宣言できます。 extern 変数、関数定義、または宣言は、現行ソース・ファイルの以降の部分によって、記述された変数または関数を使用可能にします。この宣言は、定義を置換しません。 この宣言は、外部的に定義された変数を記述します。
extern 宣言は、関数の外側またはブロックの先頭に現れます。 宣言が、関数を記述するか、関数の外側で現れて外部結合を持つオブジェクトを記述する場合は、 キーワード extern はオプションです。ストレージ・クラス指定子を指定しない場合は、関数に外部結合があると想定されています。
ある ID の宣言がファイル・スコープにすでにある場合は、 ブロック内にある同じ ID の extern 宣言は、同じオブジェクトを参照します。 ID に対するほかの宣言が、ファイル・スコープにない場合は、その ID は外部結合を持ちます。
ストレージ・クラス指定子がない宣言の前に、ストレージ・クラス指定子 static がある同じ関数に対して宣言をインクルードすると、宣言が非互換であるために、エラーになります。 オリジナルの宣言に extern ストレージ・クラス指定子を含めることは有効であり、その関数は内部結合を持ちます。
インライン関数用の GNU C セマンティクスが要求され、 ソース・コードがそれに応じてコンパイルされると、キーワード extern はキーワード inline と 結合し、単一キーワードとして振る舞います。
関連参照
以下の注釈は、C++ にのみ適用されます。
extern ストレージ・クラス指定子を持つオブジェクトは、グローバル・スコープ (C) または ネーム・スペース・スコープ (C++) で初期化できます。 extern オブジェクトの初期化指定子は、以下のうちのいずれかにする必要があります。
extern 変数を明示的に初期化しない場合は、その初期値は、該当する型のゼロになります。 extern オブジェクトの初期化は、プログラムが実行を開始するときまでに完了しています。
すべての extern オブジェクトには、静的ストレージ期間が指定されています。 メモリーは、main 関数が実行される前に extern オブジェクトに割り振られ、プログラムが終了すると解放されます。変数のスコープは、プログラム・テキスト内の 宣言の場所によって決定されます。宣言をブロック内に置くと、その変数はブロック・スコープ を持ちます。それ以外の場合は、ファイル・スコープを持ちます。
スコープと同様に、extern が宣言された変数のリンケージは、プログラム・テキスト内の宣言がどこに配置されたかによって決まります。
変数宣言が関数定義の外側に置かれ、ファイル内で以前に static と宣言されている場合、その変数は内部結合を持ちます。それ以外の場合は、ほとんどの場合、外部結合を持ちます。関数の外側で発生するオブジェクトや、ストレージ・クラス指定子を含まないオブジェクトの宣言では、
すべて外部結合を持つ ID を宣言します。
ストレージ・クラスを指定しない関数定義では、すべて外部結合を持つ関数を定義します。
名前なしネーム・スペース内のオブジェクトの場合、リンケージは外部の可
能性がありますが、名前は固有のため、他の変換単位の状況から判断されて、名前は実際上、内部
結合を持ちます。
関連参照