命名空间

编译器设置“命名空间”来区分用于各种项的标识符。 每个命名空间中的名称必须是唯一的以避免冲突,但相同的名称可出现在多个命名空间中。 这意味着,可以对两个或更多不同的项使用同一个标识符,前提是这些项位于不同的命名空间中。 编译器可以基于程序中标识符的语义上下文来解析引用。

注意

不要将命名空间的有限 C 概念与 C++“命名空间”功能混淆。 有关详细信息,请参阅“C++ 语言参考”中的命名空间

此列表描述了 C 中使用的命名空间。

语句标签
命名的语句标签是语句的一部分。 语句标签的定义始终后跟一个冒号,但它们不是 case 标签的一部分。 语句标签的使用始终后跟关键字 goto。 语句标签不必与其他名称或其他函数中的标签名称有所不同。

结构、联合和枚举标记
这些标记是结构、联合和枚举类型说明符的一部分,总是紧跟在保留字 structunionenum.的后面(如果有)。 标记名称必须不同于具有相同可见性的所有其他结构、枚举或联合标记。

结构或联合的成员
成员名称分配在与每个结构和联合类型关联的命名空间中。 即,同一标识符可以同时为任意数量的结构或联合的组件名称。 组件名称的定义总是出现在结构或联合类型说明符中。 组件名称的使用总是紧跟在成员选择运算符(-> 和 .)之后。 成员的名称在结构或联合中必须是唯一的,但它无需不同于程序中的其他名称(包括不同的结构和联合的成员或结构本身的名称)。

普通标识符
所有其他名称都属于一个包含变量、函数(包括形参和局部变量)和枚举常量的命名空间。 标识符名称具有嵌套可见性,因此您可以在块内重新定义它们。

Typedef 名称
Typedef 名称不能用作同一范围内的标识符。

例如,由于结构标记、结构成员和变量名位于三个不同的命名空间中,因此该示例中名为 student 的三个项不会发生冲突。 在该程序中,每个项的上下文允许对 student 的每个匹配项进行正确解释。 (有关结构的信息,请参阅结构声明。)

struct student {
   char student[20];
   int class;
   int id;
   } student;

student 出现在 struct 关键字的后面时,编译器会将其识别为结构标记。 当 student 出现在成员选择运算符 (-> 或 .) 的后面时,名称将引用结构成员。 在其他上下文中,student 引用结构变量。 但是,建议不要重载标记命名空间,因为它会使含义变得模糊。

请参阅

程序结构