为什么编译器不会给出相冲突的错误?

问题描述:

在下面的代码中,我声明了一个结构成员变量作为结构名称的同名。为什么编译器不会给出相冲突的错误?

struct st 
{  
    int st; 
}; 

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

我不知道,它的工作罚款GCC编译器并没有给出冲突错误。

所以,

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

'main()'返回什么? – joop

+5

变量和结构名称是从KnR开始的任何C编译器的不同实体。如果你愿意的话,可以分类不同的命名空间。所以这很正常。 – Matt

+0

'struct'告诉编译器将下面的'st'标记为值为st的结构体。同样,成员'int st'被声明为一个名为'st'的int变量。它们的用法是正交的,所以编译器在词法分析过程中不可能感到困惑。 –

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

C11, 6.2.3 Name spaces of identifiers

如果特定标识符的一个以上的声明是在一个翻译单元的任何点可见,句法上下文歧义消除引用不同的实体的用途。因此,存在对各种类别标识符的单独的名称空间,如下所示:

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

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