我学习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中定义结构之前是否有理由声明结构?
答案 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
前向声明可能很有用。