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
。我个人的意见是到处使用 typedef
s,但我也接受一致使用前者。我只是不会混合两者,因为这会导致混淆 ("do I have to add struct
for this type or not?")。
我正在使用 "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
。我个人的意见是到处使用 typedef
s,但我也接受一致使用前者。我只是不会混合两者,因为这会导致混淆 ("do I have to add struct
for this type or not?")。