Kam*_*mil 8 c struct typedef declaration definition
我在许多课程和示例中看到了许多不同的typedef用法C。
这是执行此操作的正确方法(来自ISO/IEC C 语言规范草案的示例)
typedef struct tnode TNODE;
struct tnode {
int count;
TNODE *left, *right;
};
TNODE s, *sp;
Run Code Online (Sandbox Code Playgroud)
但是我看到很多具有以下模式的代码:
typedef struct {
int a;
int b;
} ab_t;
Run Code Online (Sandbox Code Playgroud)
由于某些原因,这是错误的,还是正确的,但它提供了这样定义的结构的有限功能?
dbu*_*ush 12
这是做什么的:
typedef struct {
int a;
int b;
} ab_t;
Run Code Online (Sandbox Code Playgroud)
是定义一个匿名struct并给它别名ab_t。对于这种情况,没有问题,因为您始终可以使用别名。然而,如果其中一个成员是指向该类型的指针,则会出现问题。
例如,如果您尝试执行以下操作:
typedef struct {
int count;
TNODE *left, *right;
} TNODE;
Run Code Online (Sandbox Code Playgroud)
这是行不通的,因为类型TNODE在使用时尚未定义,并且您不能使用结构体的标记(即关键字后面的名称struct),因为它没有结构体标记。
这两个 typedef 声明之间的区别
typedef struct tnode TNODE;
struct tnode {
int count;
TNODE *left, *right;
};
TNODE s, *sp;
Run Code Online (Sandbox Code Playgroud)
和
typedef struct {
int a;
int b;
} ab_t;
Run Code Online (Sandbox Code Playgroud)
。是在第二种情况下你声明了一个未命名的结构。这意味着在该结构内您无法引用其自身。例如你不能写
typede struct {
int count;
TNODE *left, *right;
} TNODE;
Run Code Online (Sandbox Code Playgroud)
TNODE因为这个成员声明中使用的名称
TNODE *left, *right;
Run Code Online (Sandbox Code Playgroud)
尚未宣布。
但是如果结构标签的名称类似于
struct tnode {
int count;
struct tnode *left, *right;
};
Run Code Online (Sandbox Code Playgroud)
因为名称 struct tnode 已被声明。
另一个区别是,声明指向结构的指针不需要该结构的完整定义。那就是你可以写
typedef struct tnode TNODE;
TNODE *sp;
struct tnode {
int count;
TNODE *left, *right;
};
Run Code Online (Sandbox Code Playgroud)
请注意,您也可以按以下方式编写 typedef 声明
struct tnode {
int count;
struct tnode *left, *right;
} typedef TNODE;
Run Code Online (Sandbox Code Playgroud)