在研究C中的队列时,我遇到了一个类似于下面的例子。为什么在大括号开头和后面都命名了这个结构?为什么当添加相同类型的项时,结构类型在结构内再次使用?这些东西是多余的还是有意义的?
typedef void* vpoint_t;
typedef struct queue_item_t{
vpoint_t void_item;
struct queue_item_t* next;
} queue_item_t;发布于 2015-09-04 20:02:57
让我们稍微修改一下声明,使讨论更容易理解:
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,它是一个包含成员next的struct queue_item,它是一个包含成员next的struct queue_item,无限大);}才能完成,并且不能声明不完整类型的实例。但是,您可以声明指向不完整类型的指针,我们在下面这样做:struct queue_item *next;为什么不使用QueueItemType *next;而不是struct queue_item *next呢?同样,在声明next时,struct类型定义还没有完成;QueueItemType名还不存在。但是,编译器已经可以看到标记名queue_item,因此我们可以使用struct queue_item类型声明指针。
由于标记名称和ty胡枝子名称占用不同的名称空间,因此可以在不发生冲突的情况下对标记名和ty胡枝子名称使用相同的名称。编译器通过存在struct关键字来消除两者之间的歧义。
https://stackoverflow.com/questions/32405255
复制相似问题