以下是C语言中的等效内容吗?
// #1
struct myStruct {
int id;
char value;
};
typedef struct myStruct Foo;
// #2
typedef struct {
int id;
char value;
} Foo;
如果没有,我应该使用哪一个以及何时使用?
答案 0 :(得分:12)
第二个选项无法引用自身。例如:
// 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;
答案 1 :(得分:9)
不,他们并不完全等同。
在第一个版本中Foo
是名为struct myStruct
的typedef。
在第二个版本中,Foo
对于未命名的typedef
是struct
。
虽然在许多情况下可以以相同的方式使用Foo
,但是存在重要的差异。特别是,第二个版本不允许使用前向声明来声明Foo
而struct
它是typedef
,而第一个版本则是{{1}}。
答案 2 :(得分:3)
第一种形式允许您在类型定义完成之前引用结构,因此您可以在其自身内引用结构或具有相互依赖的类型:
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;
};