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

C 为什么结构名称应该有typedef?,c,struct,typedef,C,Struct,Typedef,我见过源代码总是有一个结构的typedef,并且在任何地方都使用相同的typedef,而不是直接使用结构名“structsname”等等 这背后的原因是什么?这样做有什么好处吗?它更容易阅读框b而非结构盒类型b typedef struct _entry{ char *name; int id; } Entry, *EntryP; 优点: 在上述typedef中,除了struct\u Entry之外,还定义了Entry和EntryP 因此,EntryP firstentry可以用来

我见过源代码总是有一个结构的typedef,并且在任何地方都使用相同的typedef,而不是直接使用结构名“structsname”等等


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

它更容易阅读
框b而非结构盒类型b

typedef struct _entry{
   char *name;
   int id;
} Entry, *EntryP;
优点:
在上述
typedef
中,除了
struct\u Entry
之外,还定义了
Entry
EntryP
因此,
EntryP firstentry
可以用来代替
struct\u entry*firstentry
,并且在解析时要简单一些


注意:它不像结构名应该
typedef
ined,但显然它更容易阅读。另外,使用
Entry*
vs
EntryP
完全依赖于用户。

这是一种信息隐藏形式,在创建不透明类型时非常有用。请参阅,以获得稍长的答案。

我喜欢用C:

// in a "public" header file
typedef struct Example Example;

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

像这样,在我的代码中,
Example
是一个不透明类型(即,我只能传递指向它的指针),除了实现它的操作的代码之外,它可以看到它的真正定义。(可以为不透明类型使用单独的名称,但这并没有真正的优势。)

C中的非类型定义结构名称要求在使用类型名称的任何地方都加上“struct”,因此大多数人使用typedef为类型创建一个新名称,而不需要一直加上struct关键字

这样做的原因是代码可读性、类型减少,可能还有清晰度,但typedef实际上会模糊指针类型的信息


老实说,需要typedef来为结构创建新名称是一个遗留问题,很遗憾C99没有遵循C++的做法并将其删除。

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


不确定里奇在定义这种行为时抽的是什么。我猜测早期版本的编译器中的解析器存在某种问题。

这只是为了代码的可读性。typedef只是为数据类型提供新名称。不必在任何地方都使用int,只要用你所给的新名称替换它就可以了。同样的事情也适用于结构。

实际上,我没有对结构使用typedef。 为什么? 因为我会使用一些约定,比如
s\uu
前缀,以便轻松查看我正在查看的变量类型

因为我使用了很多抽象数据类型,所以我想使用typedef是个好主意,这样用户就可以将它真正用作不透明类型。
但实际上我总是在实现中使用结构。

我通常反对像
EntryP
这样的typedef。C已经有了一个很好的方法来声明您想要的指针:
Entry*firstentry
@Hagglund:没有什么好争论的:)。它完全是主观的,一个可能喜欢
EntryP
,而另一个可能喜欢
Entry*
。我同意它是主观的,但我认为它不推荐,因为它没有充分的理由抽象了
firstentry
Entry*
类型的事实。尽管
EntryP
中的“P”旨在强调“指向”的指针,但它仍然不明确,而
Entry*
则不是。在任何情况下,我相信您的行
struct entry*firstentry
应该是
struct\u entry*firstentry
,请注意下划线我会猜测这可能简化了第一个编译器中的内存分配,这在所有内容都必须适合128k或更少的数据空间时非常重要。事实上,在最早的C编译器中,结构成员名称也有一个全局名称空间。这意味着
struct foo
struct bar
不能都有一个名为
x
的成员,这直接导致了结构成员的小标签样式(
f_x
b_x
),这在今天的一些C代码中很常见。@Dave:我想你是对的。结构成员名称有问题。太久了,我很久以前就把那个脑细胞放在角落里了。哇,他为什么要这么做?由于向后兼容,C99无法摆脱必须
typedef
才能摆脱
struct
。有很多代码,比如
structfoo{…};类型定义。。。傅struct
。这不值得混淆。我想立即知道何时必须使用
->
。typedef使这更难。