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

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

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

它更容易阅读Box b; struct boxtype b;

 typedef struct _entry{ char *name; int id; } Entry, *EntryP; 

优点:
在上面的typedefEntryEntryP都是从struct _entry定义的。
因此,可以使用EntryP firstentry代替struct _entry *firstentry并且在解析时要简单一些。

注意:它不像结构名称应该是typedefined,但显然它更容易阅读。 此外, Entry * vs EntryP的使用完全取决于用户。

这是C语言中的奇怪怪癖,结构标记名称存储在不同的命名空间(符号表)中。 C ++语言摆脱了这种行为。 typedef为全局命名空间中的结构类型创建别名。 因此,您不必在结构名称前键入“struct”。

当他定义这种行为时,不确定Ritchie吸烟了什么。 我猜测早期版本的编译器中的解析器存在某种问题。

我喜欢在C中这样做:

 // in a "public" header file typedef struct Example Example; // in a "private" header or a source file struct Example { ... }; 

像这样,我在我的代码中将Example作为一个opaque类型(即,我只能传递指向它), 除了实现其操作的代码,它可以看到它实际定义的内容。 (您可以为opaque类型使用单独的名称,但这没有真正的优势。)

它只是为了代码的可读性。 typedef只是为数据类型赋予新名称。 您可以按照自己想要的方式以及在任何使用int的位置命名,而不是在每个地方给出int,您可以用您给出的新名称替换它。 同样的事情也适用于结构。

它是一种信息隐藏forms,在创建不透明类型时非常有用。 请参阅此SO链接以获得稍长的答案。

C中的非typedefed结构名称要求在使用类型名称的任何地方添加“struct”,因此大多数人使用typedef为不需要始终预先添加struct关键字的类型创建新名称。

这样做的原因是代码可读性,减少了类型,也可能是清晰度,但是typedef实际上可能会掩盖有关指针类型的信息。

老实说,需要使用typedef为结构创建新名称是一个遗留问题,而C99没有遵循C ++的主导并删除它是一种遗憾。

我实际上不使用typedef作为结构。 为什么? 因为无论如何我会使用一些约定这样的s_前缀,以便轻松看到我正在看的是什么类型的变量。

由于我使用了很多抽象数据类型,我想使用typedef是个好主意,因此用户确实将它用作opaque类型。 但实际上我总是在实现中使用结构。