问题描述
C?
中的以下等效词是等效的// #1 struct myStruct { int id; char value; }; typedef struct myStruct Foo; // #2 typedef struct { int id; char value; } Foo;
如果没有,我应该使用哪一个以及何时?
推荐答案
不,它们并不完全等效.
在第一个版本中Foo是命名struct myStruct的TYPEDEF.
在第二版中,Foo是未命名struct的typedef.
尽管在许多情况下都可以以相同的方式使用两种Foo,但存在重要差异.特别是,第二个版本不允许使用前向声明声明Foo,而struct则是typedef,而第一个则是.
其他推荐答案
第二个选项无法引用本身.例如:
// Works: struct LinkedListNode_ { void *value; struct LinkedListNode_ *next; }; // Does not work: typedef struct { void *value; LinkedListNode *next; } LinkedListNode; // Also Works: typedef struct LinkedListNode_ { void *value; struct LinkedListNode_ *next; } LinkedListNode;
其他推荐答案
第一个形式允许您在类型定义完成之前参考结构,因此您可以参考本身内的结构或具有相互依赖类型:
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; };