如何为 C 中的结构正确使用 typedef?
How to properly use `typedef` for structs in C?
我在许多 C
课程和示例中看到了很多不同的 typedef
用法。
这是正确的方法(示例来自ISO/IEC C language specification draft)
typedef struct tnode TNODE;
struct tnode {
int count;
TNODE *left, *right;
};
TNODE s, *sp;
但是我看到很多代码具有以下模式:
typedef struct {
int a;
int b;
} ab_t;
由于某些原因这是错误的,还是正确的但它提供了像这样定义的结构的有限功能?
这是做什么的:
typedef struct {
int a;
int b;
} ab_t;
定义一个匿名的struct
并给它起别名ab_t
。对于这种情况,没有问题,因为您始终可以使用别名。它 会 但是,如果其中一个成员是指向此类型的指针,那将是一个问题。
例如,如果您尝试执行以下操作:
typedef struct {
int count;
TNODE *left, *right;
} TNODE;
这是行不通的,因为类型 TNODE
在使用时尚未定义,并且您不能使用结构的标记(即 [= 之后的名称) 12=] 关键字)因为它没有。
这两个typedef声明的区别
typedef struct tnode TNODE;
struct tnode {
int count;
TNODE *left, *right;
};
TNODE s, *sp;
和
typedef struct {
int a;
int b;
} ab_t;
。
是在第二种情况下你声明了一个未命名的结构。这意味着在结构中你不能引用它本身。例如你不能写 fir example
typede struct {
int count;
TNODE *left, *right;
} TNODE;
因为这个成员声明中使用的名字TNODE
TNODE *left, *right;
尚未申报。
但如果结构标签的名称类似于
,则可以引用该结构
struct tnode {
int count;
struct tnode *left, *right;
};
因为已经声明了名称 struct tnode。
另一个区别是声明一个指向结构的指针不需要结构的完整定义。那就是你可以写
typedef struct tnode TNODE;
TNODE *sp;
struct tnode {
int count;
TNODE *left, *right;
};
注意你也可以这样写typedef声明
struct tnode {
int count;
struct tnode *left, *right;
} typedef TNODE;
我在许多 C
课程和示例中看到了很多不同的 typedef
用法。
这是正确的方法(示例来自ISO/IEC C language specification draft)
typedef struct tnode TNODE;
struct tnode {
int count;
TNODE *left, *right;
};
TNODE s, *sp;
但是我看到很多代码具有以下模式:
typedef struct {
int a;
int b;
} ab_t;
由于某些原因这是错误的,还是正确的但它提供了像这样定义的结构的有限功能?
这是做什么的:
typedef struct {
int a;
int b;
} ab_t;
定义一个匿名的struct
并给它起别名ab_t
。对于这种情况,没有问题,因为您始终可以使用别名。它 会 但是,如果其中一个成员是指向此类型的指针,那将是一个问题。
例如,如果您尝试执行以下操作:
typedef struct {
int count;
TNODE *left, *right;
} TNODE;
这是行不通的,因为类型 TNODE
在使用时尚未定义,并且您不能使用结构的标记(即 [= 之后的名称) 12=] 关键字)因为它没有。
这两个typedef声明的区别
typedef struct tnode TNODE;
struct tnode {
int count;
TNODE *left, *right;
};
TNODE s, *sp;
和
typedef struct {
int a;
int b;
} ab_t;
。 是在第二种情况下你声明了一个未命名的结构。这意味着在结构中你不能引用它本身。例如你不能写 fir example
typede struct {
int count;
TNODE *left, *right;
} TNODE;
因为这个成员声明中使用的名字TNODE
TNODE *left, *right;
尚未申报。
但如果结构标签的名称类似于
,则可以引用该结构struct tnode {
int count;
struct tnode *left, *right;
};
因为已经声明了名称 struct tnode。
另一个区别是声明一个指向结构的指针不需要结构的完整定义。那就是你可以写
typedef struct tnode TNODE;
TNODE *sp;
struct tnode {
int count;
TNODE *left, *right;
};
注意你也可以这样写typedef声明
struct tnode {
int count;
struct tnode *left, *right;
} typedef TNODE;