6.2.3 标识符的命名空间
NOTE
C 里“同名不一定冲突”,关键就在命名空间。比如结构体标记、成员名、普通标识符,就不在同一个命名空间里。
- 如果在翻译单元的某一点上,某个特定标识符有多个声明处于可见状态,那么语法上下文会把那些指向不同实体的用法区分开来。因此,不同类别的标识符分别位于不同的命名空间中,具体如下:
- 标号名:由标号声明和使用的语法来区分;
- 结构体、联合体和枚举的标记:由其后跟着的关键字
struct、union或enum来区分;23) - 结构体或联合体的成员:每个结构体或联合体都为自己的成员拥有独立命名空间;通过访问成员时所使用表达式的类型,以及
.或->运算符来区分; - 标准属性和属性前缀:通过属性说明符的语法以及属性标记的名称来区分(6.7.13);
- 带属性前缀标记中的尾随标识符:每个属性前缀都为其引入的实现定义属性拥有独立命名空间;通过属性前缀和尾随标识符标记来区分;
- 其他所有标识符,称为普通标识符:它们在普通声明符中声明,或作为枚举常量出现。
脚注说明
23)虽然有 struct、union、enum 三种可能,但标记只共享一个命名空间。
前向引用:枚举说明符(6.7.3.3)、带标签语句(6.8.2)、结构体和联合体说明符(6.7.3.2)、结构体和联合体成员(6.5.3.4)、标记(6.7.3.4)、goto 语句(6.8.7.2)。