C中header(链表)中的结构声明

Declaration of structure in header (linked list) in C

我正在使用 "Learn C The Hard Way," 学习 C,在练习 32 中,我在 header 文件中找到了这段代码:

struct ListNode;

typedef struct ListNode {
    struct ListNode *next;
    struct ListNode *prev;
    void *value;
} ListNode;

typedef struct List {
    int count;
    ListNode *first;
    ListNode *last;
} List;

我的问题是,为什么作者写:

struct ListNode;

然后继续 typedef:

typedef struct ListNode {
    struct ListNode *next;
    struct ListNode *prev;
    void *value;
} ListNode;

在 typedef 中定义之前声明结构是否有原因?

struct ListNode;

这是单独的前向声明。旧编译器要求此类 declarations.May 与旧标准或不完整的标准实现相关

struct 前向声明在需要循环结构声明时很有用。

有些人出于未知原因或因为编码标准要求这样做。没有实际需要(IMO 这会降低代码的可读性,因为它增加了无用的冗余)。

对于typedef struct ListNode,这已经作为不完整类型的前向声明struct ListNode

对于第二个 typedef,struct 标记(struct List 的第二部分)用处不大,因为您不需要前向声明并且可能只使用 typedef 稍后使用别名。

您也可以完全不使用 typedef 并在您的代码中使用 struct ListNode/struct List。我个人的意见是到处使用 typedefs,但我也接受一致使用前者。我只是不会混合两者,因为这会导致混淆 ("do I have to add struct for this type or not?")。