名前空間
コンパイラは、異なる種類の項目に使用されている識別子を区別するために "名前空間" を設定します。 競合を回避するために、それぞれの名前空間の中では名前は一意である必要がありますが、複数の名前空間では同一の名前を使うことができます。 これは、複数の項目が異なる名前空間にあれば、それらに同じ識別子を使用できることを意味しています。 コンパイラは、プログラム内の識別子の構文コンテキストに基づいて参照を解決できます。
Note
C++ の "名前空間" 機能と C の限られた概念である名前空間を混同しないでください。 詳細については、C++ 言語リファレンスの「名前空間」をご覧ください。
この一覧は、C で使用される名前空間について説明しています。
ステートメント ラベル
名前付きステートメント ラベルは、ステートメントの一部です。 ステートメント ラベルの定義は、必ずコロンが後に続きますが、 case
ラベルの一部ではありません。 ステートメント ラベルは常にキーワード goto
のすぐ後で使用します。 ステートメント ラベルは、他の名前や他の関数のラベル名と区別する必要はありません。
構造タグ、共用体タグ、および列挙タグ
これらのタグは、構造体、共用体、列挙体型指定子の一部であり、存在する場合は、常に予約語 struct
、union
、または enum
の直後になります。 タグ名は、同じ可視性を持つ他のすべての構造体、列挙体、または共用体タグとは異なる必要があります。
構造体または共用体のメンバー
メンバー名は、各構造体型と共有体型に関連付けられた名前空間に割り当てられます。 つまり、同じ識別子が同時に複数の構造体または共用体のコンポーネント名になることがあります。 コンポーネント名の定義は、構造体型や共用体型の指定子内に常に記述されます。 コンポーネント名は、常にメンバー選択演算子 (-> および .) のすぐ後で使用します。 メンバーの名前は、構造体または共用体の中で一意である必要がありますが、異なる構造体や共用体のメンバーの名前や構造体自体の名前など、プログラム内の他の名前と異なる必要はありません。
通常の識別子
他の名前はすべて、変数、関数 (正式なパラメーターおよびローカル変数を含む)、列挙定数などの名前空間になります。 識別子名は入れ子で参照されるため、ブロック内でこれらを再定義できます。
typedef 名
Typedef 名は同じスコープ内で識別子として使用することはできません。
たとえばこの例では、student
という名前の 3 つの項目、構造タグ、構造体メンバー、および変数名は、3 つの異なる名前空間にあるため、競合しません。 各項目のコンテキストにより、プログラムでの student
の各出現箇所を正しく解釈できます (構造体については、「構造体の宣言」を参照してください。)
struct student {
char student[20];
int class;
int id;
} student;
student
が struct
キーワードの後にある場合、コンパイラはこれを構造体のタグとして認識します。 student
がメンバー選択演算子 (-> または .) の後にある場合、名前は構造体メンバーを示します。 他のコンテキストでは、student
は構造体変数を参照します。 ただし、タグの名前空間をオーバーロードすることは、意味が不明になるため推奨されません。