typedef struct queue_item_t { // 1
vpoint_t void_item;
struct queue_item_t* next; // 2
} queue_item_t; // 3
首先,请注意,整个语句定义了一个typedef。
3) 是说我们正在定义的新类型(通过typedef)将命名为queue_item_t。
1) 结构的名称(我们正在给它一个新名称)命名为struct queue_item_t。这是它的全名,包括前面的struct。
2) 因为新类型还不存在(请记住,我们仍在定义它的过程中),我们必须使用它迄今为止唯一的名称,即struct queue_item_t,来自1)。
请注意,您可以有匿名struct 定义,这允许您在1) 中省略名称。一个简单的例子:
typedef struct {
int x, y, z;
} vector3;
但是,在您的示例中,由于我们需要能够引用自身的结构,因此 next 指针必须具有已定义的类型。我们可以通过前向声明结构体,对它进行类型定义,然后使用typedefd 类型为next 定义结构体:
struct _queue_item; // 4
typedef struct _queue_item queue_item_t; // 5
struct _queue_item { // 6
vpoint_t void_item;
queue_item_t* next; // 7
}
4) 声明struct _queue_item 存在,但尚未提供它的定义。
5) typedef queue_item_t 与struct _queue_item 相同。
6)现在给出结构的定义...
7) ...使用我们的typedef'd queue_item_t。
说了这么多……在我看来,please don't use typedefs for structs。
struct queue_item {
void *data;
struct queue_item *next;
}
简单而完整。您可以设法输入这六个额外的字符。
来自Linux Kernel coding style:
第 5 章:类型定义
请不要使用“vps_t”之类的东西。
将 typedef 用于结构和指针是一个错误。当你看到一个
vps_t a;
在源代码中,它是什么意思?
相反,如果它说
struct virtual_container *a;
您实际上可以分辨出“a”是什么。
有一些例外,您可以阅读。
最近的一些相关问题: