我看过源代码总是有一个结构的typedef并且在任何地方使用相同的代码而不是直接使用结构名称作为“struct sname”等?
这背后的原因是什么?这样做有什么好处吗?
答案 0 :(得分:10)
比Box b;
struct boxtype b;
typedef struct _entry{
char *name;
int id;
} Entry, *EntryP;
优势:
在上面的typedef
中,Entry
和{ EntryP
与struct _entry
分开定义
因此,可以使用EntryP firstentry
代替struct _entry *firstentry
,并且在解析时更容易解析。
注意:它不像结构名称 应该typedef
,但显然它更容易阅读。此外,使用Entry *
vs EntryP
完全取决于用户。
答案 1 :(得分:4)
在C语言中这是一个奇怪的怪癖,结构标记名称存储在不同的命名空间(符号表)中。 C ++语言摆脱了这种行为。 typedef为全局命名空间中的结构类型创建别名。因此,您不必在结构名称前键入“struct”。
当他定义这种行为时,不确定Ritchie吸烟了什么。我猜测早期版本的编译器中的解析器存在某种问题。
答案 2 :(得分:3)
我喜欢在C:
中这样做// in a "public" header file
typedef struct Example Example;
// in a "private" header or a source file
struct Example { ... };
像这样,我在我的代码中使用Example
作为opaque类型(即,我只能传递指向它),除了以实现其操作的代码,可以看到它真正被定义为什么。 (您可以为opaque类型使用单独的名称,但这没有真正的优势。)
答案 3 :(得分:2)
它仅用于代码可读性。 typedef只是为数据类型赋予新名称。您可以按照您想要的方式以及在任何使用int的位置命名,而不是在每个地方给出int,您只需用您给出的新名称替换它即可。同样的事情也适用于结构。
答案 4 :(得分:1)
这是一种信息隐藏形式,在创建不透明类型时非常有用。请参阅this SO link以获得稍长的答案。
答案 5 :(得分:1)
C中的非typedefed结构名称要求在使用类型名称的地方添加“struct”,因此大多数人使用typedef为不需要将struct关键字预先添加到所有类型的类型创建新名称时间。
执行此操作的原因是代码可读性,减少键入,以及可能的清晰度,但typedef实际上可能会模糊有关指针类型的信息。
老实说,需要使用typedef为结构创建新名称是一个遗留问题,而且很遗憾C99没有遵循C ++的主导并删除它。
答案 6 :(得分:0)
我实际上不使用typedef作为结构。
为什么?
因为我会使用一些约会,例如s_
前缀,以便轻松查看我正在查看的变量类型。
由于我使用了很多抽象数据类型,我想使用typedef是个好主意,因此用户确实将它用作opaque类型。 但实际上我总是在实现中使用结构。