它们几乎是等价的。实际上,您可以并且应该在两个地方使用相同的名称。使用相同的名称,除非您能找到充分的理由不这样做。
您需要非匿名的一种情况是当您需要指向相同类型的对象的指针时,例如在链接列表中。
typedef struct Node {
struct Node* next;
int data;
} Node;
一种替代方案:
typedef struct Node Node;
struct Node {
Node * next;
int data;
};
根据 Linus Torvalds 的说法,除非你想隐藏它,否则你应该避免使用类型定义结构。来自Linux 内核编码风格指南 https://www.kernel.org/doc/html/v4.10/process/coding-style.html#typedefs:
请不要使用 vps_t 之类的东西。对结构和指针使用 typedef 是错误的。当你看到一个vps_t a;
在源码中,这是什么意思?相反,如果它说struct virtual_container *a;
你实际上可以分辨出 a 是什么。
很多人认为 typedef 有助于提高可读性。并非如此。它们仅用于:
a) 完全不透明的对象(其中 typedef 被主动用来隐藏对象是什么)。
...
据此,您永远不应该使用匿名结构,并且 typedef 严格用于接口。所以它应该看起来像这样:
typedef struct Node {
struct Node* next;
int data;
} Node;
但如果您真的要创建一个接口,那么通常应该将其分成头文件和源文件。在这种情况下,请将 typedef 放入头文件中,并且不要在源文件中使用 typedef:ed 类型。
.c
struct Node {
struct Node* next;
int data;
} Node;
void insert(struct Node* head, int data)
{
// Code
}
.h
typedef struct Node Node;
void insert(Node* head, int data);
考虑到上述所有因素,使用匿名结构的唯一有效情况是同时声明一个对象,如下所示:
struct {
int data;
float more_data;
} myObject;