为什么结构名称应该有typedef?

时间:2010-04-09 07:15:04

标签: c struct typedef

我看过源代码总是有一个结构的typedef并且在任何地方使用相同的代码而不是直接使用结构名称作为“struct sname”等?

这背后的原因是什么?这样做有什么好处吗?

7 个答案:

答案 0 :(得分:10)

Box b;

更容易阅读struct boxtype b;
typedef struct _entry{
   char *name;
   int id;
} Entry, *EntryP;

优势:
在上面的typedef中,Entry和{ EntryPstruct _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类型。 但实际上我总是在实现中使用结构。