首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在C中的struct声明中使用了类型胡枝子名称两次?

为什么在C中的struct声明中使用了类型胡枝子名称两次?
EN

Stack Overflow用户
提问于 2015-09-04 19:27:36
回答 4查看 5.6K关注 0票数 18

在研究C中的队列时,我遇到了一个类似于下面的例子。为什么在大括号开头和后面都命名了这个结构?为什么当添加相同类型的项时,结构类型在结构内再次使用?这些东西是多余的还是有意义的?

代码语言:javascript
运行
复制
typedef void* vpoint_t;

typedef struct queue_item_t{
  vpoint_t void_item;
  struct queue_item_t* next;
} queue_item_t;
EN

Stack Overflow用户

发布于 2015-09-04 20:02:57

让我们稍微修改一下声明,使讨论更容易理解:

代码语言:javascript
运行
复制
typedef struct queue_item {
  vpoint_t void_item;
  struct queue_item* next;
} QueueItemType;

C支持几个不同的名称空间;为联合、结构和枚举类型上的标记名称保留一个名称空间。在本例中,标记名为queue_item。另一个名称空间是为常规标识符保留的,其中包括像QueueItemType这样的typedef名称。

next成员被用来指向struct queue_item类型的另一个实例(即队列中的下一项)。它被声明为指向struct queue_item的指针,有两个原因:

  • 结构类型不能包含自身的实例;首先,类型必须无限大(struct queue_item包含一个成员next,它是一个包含成员nextstruct queue_item,它是一个包含成员nextstruct queue_item,无限大);
  • 结构类型定义直到关闭的}才能完成,并且不能声明不完整类型的实例。但是,您可以声明指向不完整类型的指针,我们在下面这样做:struct queue_item *next;

为什么不使用QueueItemType *next;而不是struct queue_item *next呢?同样,在声明next时,struct类型定义还没有完成;QueueItemType名还不存在。但是,编译器已经可以看到标记名queue_item,因此我们可以使用struct queue_item类型声明指针。

由于标记名称和ty胡枝子名称占用不同的名称空间,因此可以在不发生冲突的情况下对标记名和ty胡枝子名称使用相同的名称。编译器通过存在struct关键字来消除两者之间的歧义。

票数 8
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32405255

复制
相关文章

相似问题

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