C

时间:2015-07-19 17:46:44

标签: c struct header-files

我学习C"学习C艰难的方式,"在练习32中,我在头文件中找到了这段代码:

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中定义结构之前是否有理由声明结构?

2 个答案:

答案 0 :(得分:4)

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

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

对于第二个typedef,struct标签(struct List的第二部分)没什么用,因为你不需要前向声明,并且可能只使用typedef ed别名以后。

您也可以完全不使用typedef并在代码中使用struct ListNode / struct List。我个人的意见是到处使用typedef,但我也会接受对前者的一贯使用。我只是不会混合两者,因为这会导致混淆(“我是否必须为此类型添加struct?”)。

答案 1 :(得分:0)

struct ListNode;

这是单独的前向声明。旧的编译器需要这种类型的声明。可能与较旧的标准或不完整的标准实现相关

当需要循环结构声明时,

struct前向声明可能很有用。