スコープ
宣言:インデックス への移動
識別子のスコープ(適用範囲)は,その識別子をそのオブジェクトにアクセスするために使用できるプログラムの一部分です。スコープは,ブロック(またはローカル),関数,関数プロトタイプ,ファイル,クラス,条件,および名前空間(C++ のみ)の 6 つのカテゴリに分類されます。これらは,識別子がどこでどのように宣言されたかによって決まります。
- ブロック。ブロック(ローカル)スコープを持つ識別子のスコープは,宣言された位置から始まり,その宣言が含まれているブロックの終わりまで続く。このようなブロックは封入ブロック(enclosing block)と呼ばれる。関数定義に伴うパラメータ宣言もブロックスコープを持ち,これは関数を定義しているブロックスコープに限定される
- 関数。関数スコープを持つ識別子は,文ラベルだけ。ラベルは,そのラベルが宣言されている関数内のどこからでも goto 文で使用することができる。ラベルは,後ろに文が続く label_name: を記述することによって暗黙に宣言される。ラベルは,関数内でユニークでなければならない
- 関数プロトタイプ。関数プロトタイプ(関数定義の一部ではない)のパラメータ宣言リスト内で宣言される識別子は,関数プロトタイプのスコープを持つ。このスコープは,関数プロトタイプが終わる位置で終了する
- ファイル。ファイルスコープの識別子,すなわちグローバル識別子は,すべてのブロックとクラスの外部で宣言される。これらの識別子のスコープは,宣言を行った位置からソースファイルの終わりまで
- クラス(C++)。ここではクラスを,データ構造とそれらに作用する関数も含めた,特定のメンバーの集まりとして考える。クラススコープは,特定のクラスのメンバーの名前に適用される。。クラスとそのオブジェクトには,アクセスとスコープに関する多くの規則がある。クラスを参照
- 条件(C++)。条件内の宣言がサポートされる。変数は,if,while,switch の各文の式の中で宣言される。その変数のスコープは,その文のスコープになる。if 文では,変数は else ブロックに対するスコープ内にもある
- 名前空間(C++)。名前空間は,プログラムエンティティ(識別子,クラス,関数など)の論理グループである。名前空間は開かれているため,複数のコンパイルユニットに範囲が及ぶ。名前空間は「名前付けされたスコープの導入」とみなすことができる。多くの点で C++ のクラスに類似している。名前空間の宣言方法と使い方の詳細は,キーワード名前空間のヘルプを参照してください。
名前空間
名前空間(name space)とは,その中では識別子の重複が許されないスコープのことです。C++ の名前空間はこの概念を拡張して,スコープに名前を付けることができます。C++ が持つ名前付けされたスコープ機能のほかに,C プログラミング言語は異なる 4 つのクラスに分類されます。
- goto ラベル名。このラベルが宣言される関数の中では重複してはならない
- 構造体名,共用体名,および列挙型のタグ名。それらが定義されているブロック中では重複してはならない。関数の外部で宣言されるタグ名は,外部で定義されるすべてのタグ名と重複してはならない
- 構造体および共用体のメンバー名。それらが定義されている構造体,共用体の中では重複してはならない。異なる構造体の中で,同一の名前を持つデータ型あるいはメンバーオフセットに関する制限はない
- 変数,typedef 名,関数,列挙型メンバー名。それらが定義されているブロック中では重複してはならない。外部で宣言される識別子は,ほかの外部変数名と重複してはならない