如何为 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;