代码之家  ›  专栏  ›  技术社区  ›  msc

为什么编译器不给出一个冲突的错误?

  •  3
  • msc  · 技术社区  · 7 年前

    在下面的代码中,我将结构成员变量声明为与结构名称相同的名称。

    struct st 
    {     
        int st;
    };
    
    int main()
    {
       struct st t;
       t.st = 7;
       return 0;
    }
    

    我想知道,它的工作很好 通用条款 编译器,不会给出冲突错误。

    所以

    • 编译器如何知道结构名和变量名?
    • 编译器内部使用什么机制?
    2 回复  |  直到 7 年前
        1
  •  9
  •   P.P    7 年前

    是的,它是有效的。结构标记和结构成员位于不同的命名空间中。

    C11, 6.2.3 Name spaces of identifiers :

    • 标签名称(通过标签声明和使用的语法消除歧义);
    • 关键字struct、union或enum的结构、联合和枚举的标记(通过遵循any32消除歧义);
    • 结构或工会的成员;每个结构或联合都有一个单独的成员名称空间(通过.or->运算符访问成员时使用的表达式类型消除歧义);
        2
  •  3
  •   unwind    7 年前

    结构类型的名称为 struct st . 不仅仅是 st ,所以根本没有冲突。