You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何struct的标签、成员及实例允许使用相同的标识符名称?

问题解答

你提到的可正常编译的代码片段如下:

struct foo  { int foo; } foo;

该写法完全符合C语言语法规则,核心原因是C语言存在独立的命名空间规则,同名标识符分属不同命名空间时不会产生冲突:

  • C标准明确划分了四类互不干扰的命名空间:
    1. 结构体/联合体/枚举的标签名(跟在struct/union/enum关键字后的名称),专属标签命名空间
    2. 每个结构体/联合体内部的成员名,专属对应结构的成员命名空间,不同结构的成员名互不影响
    3. 变量、函数、typedef别名等普通标识符,专属普通标识符命名空间
    4. goto语句使用的标签名,专属goto标签命名空间
  • 代码中三处foo恰好分属三类不同的命名空间:
    1. 第一个foo是结构体的标签名,属于标签命名空间
    2. 第二个foo是struct foo的成员,属于该结构体专属的成员命名空间
    3. 第三个foo是定义的全局结构体变量,属于普通标识符命名空间

实际使用时三者的引用方式完全区分:引用类型写struct foo,引用变量写foo,引用成员写foo.foo,编译器可以完全正确识别,因此不会触发任何警告或错误。


内容的提问来源于stack exchange,提问作者ADBeveridge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:24:03