スコープおよび可視性
識別子の "可視性" によって、参照できるプログラムの部分 (その "スコープ") が決定されます。識別子は、表示されるファイル、関数、ブロック、または関数プロトタイプに制限される可能性がある、"スコープ" に包含されるプログラムの一部でのみ表示できます (つまり、使用できます)。 識別子のスコープは、その名前が使用できるプログラムの一部です。 これは "構文のスコープ" と呼ばれる場合があります。スコープには、関数、ファイル、ブロック、関数プロトタイプの 4 種類があります。
ラベル以外のすべての識別子には、宣言が行われるレベルによって決定されるスコープがあります。 スコープのそれぞれの種類に対する次の規則は、プログラム内の識別子の可視性を制御します。
ファイル スコープ
ファイル スコープを持つ識別子の宣言子または型指定子は、任意のブロックまたはパラメーターのリストの外部に記述され、宣言の後の翻訳単位内の任意の場所からアクセスできます。 ファイル スコープを含む識別子名は、多くの場合、"グローバル" または "外部" と呼ばれます。グローバル識別子のスコープは、その定義または宣言の時点から始まり、翻訳単位の末尾で終了します。
関数スコープ
ラベルは、関数スコープを持つ識別子の唯一の種類です。 ラベルは、ステートメントで使用することで暗黙的に宣言されます。 ラベル名は関数内で一意である必要があります (ラベルとラベル名に関する詳細については、goto ステートメントとラベル付きステートメントに関するページをご覧ください)。
ブロック スコープ
ブロック スコープを持つ識別子の宣言子または型指定子は、ブロック内または関数定義の仮パラメーター宣言のリスト内に記述されます。 その宣言または定義から、その宣言または定義を含むブロックの末尾は参照可能です。 そのスコープは、そのブロックと、そのブロックに入れ子になったすべてのブロックに制限され、関連するブロックを閉じる中かっこで終了します。 このような識別子は、"ローカル変数" と呼ばれることがあります。
関数プロトタイプのスコープ
関数プロトタイプ スコープを持つ識別子の宣言子または型指定子は、(関数宣言の一部ではない) 関数プロトタイプのパラメーター宣言のリスト内に記述されます。 そのスコープは関数宣言子の末尾で終了します。
他のソース ファイルの変数を参照できるようにするための適切な宣言については、「ストレージ クラス」をご覧ください。 ただし、 static
ストレージクラス指定子を使用して外部レベルで宣言された変数と関数は、定義されたソース ファイル内でのみ参照できます。 他の関数はすべてグローバルに参照できます。