首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的"struct命名空间“有技术原因吗?

C中的"struct命名空间“有技术原因吗?
EN

Stack Overflow用户
提问于 2014-11-30 11:34:35
回答 2查看 670关注 0票数 6

在C中,大多数声明结构的代码将遵循以下模式:

代码语言:javascript
复制
/* struct forward-declaration */
typedef struct T T ;

/* struct definition */
typedef struct T
{
   /* etc. */
} T ;

与我交谈的大多数开发人员甚至都不知道上面的代码同时做了两件事(struct声明,然后在普通的命名空间中混叠了结构名称),而且只是出于习惯而写的。

在C++中,问题得到了缓解,因此您可以省略打印部分。在C#和Java中,设计人员甚至都不费心。因此,这些语言无法帮助理解为什么C会这样做。

因此,在Oliver Charlesworth的建议之后:

是否有技术原因使struct T 与其他普通标识符分离?

编辑

C89/C90标准的相关部分是:

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

  • ..。

  • 结构标记、联合标记和枚举标记(通过跟随关键字struct、union或enum消除歧义)。

  • ..。

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

C11的文本(n 1570:6.2.3标准草案)大致相同。

EN

回答 2

Stack Overflow用户

发布于 2021-09-08 15:05:20

在将typedef添加到复杂的解析之前,对象声明总是以一个保留字开头:structintcharfloatdouble,可能是longunion (不确定这些词是在typedef之前还是之后添加的)。因为除了关键字struct之外,任何地方都不能显示结构标记,所以编译器没有理由关心结构标记是否与任何其他标识符共享名称。

需要将typedef名称与任何其他标识符的名称区分开来,这是由于语法上的歧义造成的,即允许在对象声明或强制转换表达式中使用自定义类型,而不使用任何保留的单词或标点符号(在函数开始时,x * y;可以创建一个名为x*类型的对象,也可以将x乘以y并丢弃该结果,(x)(y)可以将y转换为x类型,或者使用参数y调用函数)。

票数 2
EN

Stack Overflow用户

发布于 2014-11-30 11:55:08

只有当您希望使用第二个声明中的名称struct T引用T时,才需要第一行。

对于不包含此类引用的结构,只需要第二种形式。对于这种情况,为了简单和简洁,我建议删除当时毫无意义的struct标记:

代码语言:javascript
复制
typedef struct {
  /* interesting fields go here */
} T;

而且,typedef不“将结构名称带入正常的名称空间”,而是为不同类型的名称struct T创建别名(T) (就像typedef总是做的那样)。当然,这里的名称拼写之间没有联系,这就是为什么我建议首先删除标记struct的原因,它只是添加了一个大多数时候都没有意义的名称。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27212766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档