为什么编译器没有给出冲突错误?

时间:2017-10-10 08:57:06

标签: c variables gcc structure c11

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

struct st 
{     
    int st;
};

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

我想知道,它在 GCC 编译器上工作正常并且没有出现冲突错误。

所以,

  • 编译器如何知道结构名称和变量名称?
  • 编译器内部使用什么机制?

2 个答案:

答案 0 :(得分:9)

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

C11, 6.2.3 Name spaces of identifiers

  

如果在翻译单元中的任何一点可以看到多个特定标识符的声明,则语法上下文消除了引用不同实体的用法。因此,各种标识符类别都有单独的名称空间,如下所示:

     
      
  • 标签名称(通过标签声明和使用的语法消除歧义);
  •   
  • 关键字struct,union或enum)的结构,联合和枚举的标记(通过遵循any32消除歧义);
  •   
  • 结构或工会的成员;每个结构或联合为其成员都有一个单独的名称空间(通过。或 - >运算符用于访问该成员的表达式的类型消除歧义);
  •   
  • 所有其他标识符,称为普通标识符(在普通声明符中声明或作为枚举常量声明)。
  •   

答案 1 :(得分:3)

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