In which cases should we use typedef for a structure definition?
Possible Duplicate:
typedef struct vs struct definitions
最近我在读nginx源代码。有这么多的结构被定义为
1 2 3 4 5 | typedef struct { field_1; field_2; /* ... */ } some_obj_t; |
但仍有一些其他结构被定义为
1 2 3 4 5 | struct some_obj_s { field_1; field_2; /* ... */ }; |
然后,在其他一些头文件(如
1 | typedef struct some_obj_s some_obj_t; |
我的问题是(可能重复…):
- 为什么作者不使用相同的形式来定义所有结构?
- 在哪种情况下,我们应该在
struct 定义上使用typedef ?是否有任何OO或设计模式方面的考虑?
在结构上使用typedef主要是为了方便起见。例如:
1 2 3 4 5 | typedef struct List_ { ... } List; |
这允许您将list类型的变量定义为:
1 | List myList; |
而不是:
1 | struct List_ myList; |
所有这些额外的结构语句都会使代码混乱。typedef的另一个用途是实现一种类型作为另一种类型。例如:
1 | typedef List Queue; |
这将新类型队列定义为以前定义的类型列表。这样就可以像使用列表一样使用队列。
不同的使用反映了类型是在接口中使用(仅限),还是必须知道结构信息。
注记:
1 | typedef struct some_obj_s some_obj_t; |
告诉编译器有一个带有标记
在实现的某个地方,您可以找到结构类型的定义(在最不常见的情况下除外),例如:
1 2 3 4 | struct some_obj_s { ...members defined... }; |
如果此声明(定义)在范围内,则可以创建
注记:
1 2 3 4 | typedef struct /* no tag */ { ... } another_obj_t; |
定义无标记结构类型。提供了类型的详细信息,因此类型是完整的。
您还可以看到:
1 2 3 4 | typedef struct yao_s { ...members defined... } yao_t; |
这两者都声明结构类型及其标记和typedef。
单独的typedef具有自引用结构的优势,例如列表:
1 2 3 4 5 6 7 | typedef struct GenericList GenericList; struct GenericList { void *data; GenericList *next; GenericList *prev; }; |
如果没有单独的
注意,posix为实现保留以
标记和typedef不需要使用单独的名称(如
Why do authors not use the same form to define all structures?
因为它们采用了某种编码方式。
例如,Linux内核编码标准使用不带typedef的结构表示法。这是纯粹的编码风格,他们没有令人信服的理由解释为什么要这样做,他们只是相信代码中的"结构"提高了可读性,因为他们认为typedef"隐藏了类型"。
其他人不同意,例如,WindowsAPI使用的全是typedef表示法,而不是结构表示法。我认为,这种编码方式更为常见,因为它提醒了很多面向OO支持的语言风格:C++、爪哇、C等。
任何形式都不能轻易地被证明是正确的,这是非常主观的。像大多数编码风格一样重要。
In which case(s) should we use typedef on a struct definition? Is there any OO or design pattern considerations?
确实有。在C语言中有一种不透明或不完整的类型,它允许您实现变量的真正私有封装。看看我昨天发布的这个例子。
在这个例子中,头文件中有
然后在.c文件中,有一个作为
请通过以下链接找到第二个问题的答案:
为什么我们要在C中如此频繁地使用typedef结构?