ネーム・スペースは、ID を使用できるさまざまな構文コンテキストです。同じコンテキス ト内および同じスコープ内では、ID によってエンティティーを一意的に識別できる必要があります。 ここで使用するネーム・スペース という用語は、C および C++ に適用されるものであり、 C++ のネーム・スペース言語フィーチャーを指すものではありません。コンパイラーは、ネーム・スペース を設定して、 種類が異なるエンティティーを参照する ID を区別します。異なるネーム・スペース内に同一 ID が存在する場合、これらの ID は同じスコープ内にあっても互いに干渉しません。
各 ID が そのネーム・スペース内で固有である場合には、同じ ID を使用して、別のオブジェクトを宣言することができます。プログラム内の ID の構文上のコンテキストによって、コンパイラーは、 そのネーム・スペースを明確に解決します。
次の 4 つの各ネーム・スペース内では、ID を固有にする必要があります。
ID は、同じネーム・スペース内で再定義できますが、閉じたプログラム・ブロック内で再定義します。
構造体タグ、構造体メンバー、変数名、およびステートメント・ラベルは、4 つの異なるネーム・スペースにあります。 つまり、次の例の student 項目間では、名前の競合は発生しません。
int get_item() { struct student /* structure tag */ { char name[20]; /* this structure member may not be named student */ int section; int id; } sam; /* this structure variable should not be named student */ goto student; student:; /* null statement label */ return 0; student fred; /* legal struct declaration in C++ */ }
コンパイラーは student が発生するたびに、プログラム内のコンテキストに基づ
いて解釈します。
例えば、キーワード struct の後に student が表示された場合は、これは構造体タグを意味します。
名前 student は struct student の構造体メンバーに対しては使用できません。
goto 文の後に student が現れたときは、コンパイラーは、ヌル・ステートメント・ラベルに
制御を渡します。ほかのコンテキストでは、
ID student は、構造変数を参照します。