为什么编译器不会给出相冲突的错误?
问题描述:
在下面的代码中,我声明了一个结构成员变量作为结构名称的同名。为什么编译器不会给出相冲突的错误?
struct st
{
int st;
};
int main()
{
struct st t;
t.st = 7;
return 0;
}
我不知道,它的工作罚款GCC编译器并没有给出冲突错误。
所以,
- 编译器如何知道结构名和变量名?
- 编译器内部使用什么机制?
答
是的,它是有效的。结构标记和结构成员位于不同的名称空间中。
C11, 6.2.3 Name spaces of identifiers:
如果特定标识符的一个以上的声明是在一个翻译单元的任何点可见,句法上下文歧义消除引用不同的实体的用途。因此,存在对各种类别标识符的单独的名称空间,如下所示:
- 标签名称(由标签声明和使用的语法消除歧义);
- 关键字struct,union或enum的结构体,联合体和枚举(通过下面的any32消除歧义)的标签;
- 结构或联盟的成员;每个结构或联合有一个单独的名字空间给它的成员(用用于通过。或 - >运算符访问成员的表达式的类型来消除歧义);
- 所有其他标识符,称为普通标识符(在普通声明中声明或作为枚举常量)。
答
结构类型的名称是struct st
。不只是st
,所以根本没有冲突。
'main()'返回什么? – joop
变量和结构名称是从KnR开始的任何C编译器的不同实体。如果你愿意的话,可以分类不同的命名空间。所以这很正常。 – Matt
'struct'告诉编译器将下面的'st'标记为值为st的结构体。同样,成员'int st'被声明为一个名为'st'的int变量。它们的用法是正交的,所以编译器在词法分析过程中不可能感到困惑。 –