外部レベルの宣言のストレージ クラスの指定子
外部変数はファイル スコープ変数です。これらは関数の外部で定義され多くの関数に使用できます。関数は外部のレベルでのみ定義し入れ子にすることはできません。既定では外部変数へのすべての参照と同じ名前の関数にはに 「外部リンケージ」である一つのオブジェクトへの参照ですこれをオーバーライドするために 静的 のキーワードを使用します。 静的 のこのセクションの情報について詳細については後の " " を参照してください。
外部のレベルの変数を宣言する変数のシグネチャ (「宣言」) を定義し他の場所で定義されている変数への参照 (「宣言」を参照してください)。
また変数を初期化外部変数宣言 (暗黙的または明示的に) 変数の宣言です。外部レベルの定義が複数の形式にすることができます :
静的 " ストレージ クラスの指定子と宣言する変数。初期化 に説明されているように明示的に定数式の 静的 の変数を初期化できます。初期化子を省略すると変数は既定ではは 0 に初期化されます。たとえば次の二つのステートメントは可変 k の両方が調べられた定義です。
static int k = 16; static int k;
外部レベルで明示的に初期化していない変数。たとえばint j = 3; は可変 j の定義です。
外部のレベルの変数宣言で (つまり関数のすべての外部) 静的 または extern " ストレージ クラスの指定子を使用するかストレージ クラスの指定子が完全に省略できます。外部のレベルで 自動 登録 と終了の ストレージ クラス指定子 を使用できません。
変数が外部レベルで定義されている場合翻訳単位の残りの部分全体を通して表示されます。変数は同じソース宣言の前に表示されません。また参照の宣言が表示されるようにする場合はほかのソース ファイルで次のように表示されません。
静的 に関する規則は以下が含まれています :
静的 のキーワードを使用せずにすべてのブロックの外側で宣言された変数はプログラム全体を保持する値を常になります。特定の翻訳単位へのアクセスを制限するには 静的 のキーワードを使用する必要があります。これは内部リンケージ指定 「」を参照してください。これらのプログラム全体でグローバルにするか明示ストレージ クラスを省略するかキーワード extern を使用すると以下の一覧の規則を参照してください。このになります外部リンケージ 「」を参照してください。内部および外部リンケージではリンケージ で説明します。
一度だけプログラム内の外部レベルの変数を定義できます。同じ名前を持つ別の変数と翻訳単位の 静的 " ストレージ クラスの指定子を定義できます。 静的 各定義は独自の翻訳単位内だけで参照できるため競合が発生しません。これは単一のユニット移動の関数で共有する必要のあるそのほかの翻訳単位で表示できない使用する識別子名を非表示にする便利な方法を示します。
静的 " ストレージ クラスの指定子は関数に適用できます。関数 静的 を宣言すると名前が宣言されている外部ファイルの非表示です。
extern を使用するための規則は次のとおりです :
extern " ストレージ クラスの指定子は他の場所で定義された変数への参照を宣言します。別のソース ファイルの定義を表示するか変数が同じソース ファイル内で定義前に表示するために extern の宣言を使用できます。外部レベルの変数への参照を宣言して変数を宣言した参照が実行される変換単位の残りの部分全体表示されます。
有効な extern の参照に参照する変数は外部レベルでは一度一度だけ定義します。この定義によりプログラムを構成する変換単位のいずれかに extern のストレージ クラス (なし) です。
例
次の例は外部宣言を示しています :
/******************************************************************
SOURCE FILE ONE
*******************************************************************/
#include <stdio.h>
extern int i; // Reference to i, defined below
void next( void ); // Function prototype
int main()
{
i++;
printf_s( "%d\n", i ); // i equals 4
next();
}
int i = 3; // Definition of i
void next( void )
{
i++;
printf_s( "%d\n", i ); // i equals 5
other();
}
/******************************************************************
SOURCE FILE TWO
*******************************************************************/
#include <stdio.h>
extern int i; // Reference to i in
// first source file
void other( void )
{
i++;
printf_s( "%d\n", i ); // i equals 6
}
この例のケース 2 のソース ファイルが i の 3 種類の外部宣言の合計が含まれています。1 種類の宣言だけです。宣言を定義する」。その宣言
int i = 3;
グローバル変数 i を定義し初期値 3. で初期化します。extern を使用して最初のソース ファイルの先頭に 「 i の宣言を参照するには」グローバル変数を定義ファイルの宣言の前に表示します。2 つ目のソース ファイルの i の参照の宣言では変数をそのソース ファイルで表示します。変数の定義のインスタンスが翻訳単位で指定されていない場合コンパイラはあると見なします。
extern int x;
宣言とその参照定義の参照。
int x = 0;
プログラムの別の翻訳単位で表示されます。
3 つすべての関数mainnext と other は同じタスクを実行します : これらは i が向上しそれを出力します。値 45および 6 が出力されます。
可変 i が初期化されそれは 0 に自動的に設定します。この場合値 12および 3 が印刷されます。変数の初期化については初期化 を参照してください。