Они в значительной степени эквивалентны.На самом деле, вы можете и использовать одно и то же имя в обоих местах.Используйте одно и то же имя, если только у вас нет веских причин не делать этого.
Одна из ситуаций, когда вы хотите использовать неанонимное имя, - это когда вам нужны указатели на объект того же типа, как в связанном списке.
typedef struct Node {
struct Node* next;
int data;
} Node;
Одна альтернатива:
typedef struct Node Node;
struct Node {
Node * next;
int data;
};
Согласно Линусу Торвальдсу, вам следует избегать структур определения типа, если вы не хотите их скрывать.Из Руководства по стилю кодирования ядра Linux :
Пожалуйста, не используйте такие вещи, как vps_t.Ошибочно использовать typedef для структур и указателей.Когда вы видите vps_t a;
в источнике, что это значит?Напротив, если он говорит struct virtual_container *a;
, вы можете сказать, что это такое.
Многие думают, что typedefs помогают читабельности.Не так.Они полезны только для:
a) полностью непрозрачных объектов (где typedef активно используется, чтобы скрыть, что это за объект).
...
В соответствии с этим, вы никогда не должны использовать анонимные структуры, а typedefs предназначены исключительно для интерфейсов.Таким образом, это должно выглядеть так:
typedef struct Node {
struct Node* next;
int data;
} Node;
Но если вы действительно создаете интерфейс, вы должны разделить его на файл заголовка и исходный файл.В этом случае поместите typedef в заголовочный файл и НЕ используйте typedef: ed type вообще в исходном файле.
.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;