如何在 C 中正确使用“typedef”结构?

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),因为它没有结构体标记。


Vla*_*cow 7

这两个 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)