为何struct的标签、成员及实例允许使用相同的标识符名称?
问题解答
你提到的可正常编译的代码片段如下:
struct foo { int foo; } foo;
该写法完全符合C语言语法规则,核心原因是C语言存在独立的命名空间规则,同名标识符分属不同命名空间时不会产生冲突:
- C标准明确划分了四类互不干扰的命名空间:
- 结构体/联合体/枚举的标签名(跟在
struct/union/enum关键字后的名称),专属标签命名空间 - 每个结构体/联合体内部的成员名,专属对应结构的成员命名空间,不同结构的成员名互不影响
- 变量、函数、typedef别名等普通标识符,专属普通标识符命名空间
- goto语句使用的标签名,专属goto标签命名空间
- 结构体/联合体/枚举的标签名(跟在
- 代码中三处
foo恰好分属三类不同的命名空间:- 第一个
foo是结构体的标签名,属于标签命名空间 - 第二个
foo是struct foo的成员,属于该结构体专属的成员命名空间 - 第三个
foo是定义的全局结构体变量,属于普通标识符命名空间
- 第一个
实际使用时三者的引用方式完全区分:引用类型写struct foo,引用变量写foo,引用成员写foo.foo,编译器可以完全正确识别,因此不会触发任何警告或错误。
内容的提问来源于stack exchange,提问作者ADBeveridge
相关产品推荐
相关产品推荐

