标识名称空间

名称空间是可以在其中使用标识的各种语法上下文。 在同一上下文和同一作用域中,标识必须唯一地标识实体。 请注意,此处使用的术语 名称空间 适用于 C 和 C++ ,并且不引用 C++ 名称空间语言功能部件。 编译器设置 名称空间 以区分引用不同类型实体的标识。 不同名称空间中的相同标识不会相互干扰,即使它们在同一作用域中也是如此。

只要每个标识在其名称空间中是唯一的,同一个标识就可以声明不同的对象。 程序中标识的语法上下文使编译器能够在无岐义的情况下解析其名称空间。

在以下四个名称空间中的每个名称空间内,标识必须唯一:
  • 以下类型的 标记 在单个作用域内必须唯一:
    • 枚举
    • 结构和联合
  • 结构,并集和类的 成员 必须在单个结构,并集或类类型中唯一。
  • 语句标签 具有函数作用域,并且在函数中必须唯一。
  • 所有其他 普通标识 在单个作用域内必须唯一:
    • C 函数名 (C++ 函数名可能会重载)
    • 变量名称
    • 函数参数的名称
    • 枚举常量
    • typedef 名称

您可以使用包含的程序块在同一名称空间中重新定义标识。

结构标记,结构成员,变量名称和语句标签位于四个不同的名称空间中。 在以下示例中,在名为 student 的项之间不会发生名称冲突:
int get_item()
{
   struct student        /* structure tag */
   {
      char student[20];  /* structure member */
      int section;
      int id;
   } student;            /* structure variable */

   goto student;
   student:;             /* null statement label  */
   return 0;
   }
编译器通过其在程序中的上下文来解释 student 的每次出现: 当 student 出现在关键字 struct之后时,它是一个结构标记; 当它出现在定义 student 类型的块中时,它是一个结构成员变量; 当它出现在结构定义的末尾时,它声明一个结构变量; 当它出现在 goto 语句之后时,它是一个标签。