Первая форма позволяет вам обращаться к структуре до завершения определения типа, поэтому вы можете ссылаться на структуру внутри себя или иметь взаимозависимые типы:
struct node {
int value;
struct node *left;
struct node *right;
};
typedef struct node Tree;
или
struct A;
struct B;
struct A {
struct B *b;
};
struct B {
struct A *a;
};
typedef struct A AType;
typedef struct B Btype;
Вы можете объединить два вида так:
typedef struct node {
int value;
struct node *left;
struct node *right;
} Tree;
typedef struct A AType; // You can create a typedef
typedef struct B BType; // for an incomplete type
struct A {
BType *b;
};
struct B {
AType *a;
};