繁体   English   中英

为什么可以在结构定义中使用相同的名称?

[英]Why can you use the same name in struct definitions?

我最近发现了这个代码:

struct foo  { int foo; } foo;

我编译了这个片段(当然有一个空的main()函数!),它编译时没有警告。 为什么这是合法的?

编译器可以通过它们出现的上下文来区分它们。 C 2018 6.2.3,“标识符的命名空间”,说:

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

标签名称(通过标签声明和使用的语法消除歧义);

— 结构、联合和枚举的标签(通过跟随任何关键字structunionenum消除歧义);

——结构或工会的成员 每个结构或联合都有一个单独的名称空间用于其成员(通过用于通过.->运算符访问成员的表达式类型来消除歧义);

— 所有其他标识符,称为普通标识符(在普通声明中声明或作为枚举常量声明)。

C 中的名称曾经位于命名空间中。
在您的示例中,名称 foo 出现在结构体、结构体字段和全局命名空间中。
允许这种重复情况可能是因为需要额外的计算才能找到这些命名空间之间的冲突,而且计算过去非常昂贵。
从那时起,C 保持向后兼容性,因为这就是 C 所做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM