2010-04-09 128 views
9

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

这是什么原因?这样做有什么好处吗?容易

+0

在他的书* Expert C Programming *中,Peter van der Linden指出结构的typedef是无用的,你不应该打扰。我喜欢这个。 typedef的所有功能都可以节省你在''struct''这样的几个地方写入'struct'',比如声明和原型。这是不值得的混淆。我想立刻知道何时必须使用' - >'或'.'。 Typedefs使这更难。 – Jens 2017-08-20 14:19:33

回答

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 *EntryP完全取决于用户。

+3

我通常反对类似于'EntryP'的typedefs。 C已经有了一个完美的方式来声明你想要的指针:'Entry * firstentry'。 – 2010-04-11 21:40:14

+1

@Hagglund:没有什么可以争论的:)。它完全是主观的,可能会喜欢'EntryP',而其他可能会喜欢'Entry *'。 – 2010-04-11 22:35:16

+1

我同意它是主观的,但我不得不认为它不被推荐,因为它没有理由地抽象出'firstentry'类型为'Entry *'的事实。虽然'EntryP'中的'P'是为了强调'指向',但它仍然不明确,而'Entry *'不是。在任何情况下,我相信你的行'struct entry * firstentry'应该是'struct_entry * firstentry',注意下划线 – SiegeX 2010-05-12 00:08:50

1

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

3

我喜欢做这在C:

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

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

这样,我有Example为不透明的类型在我的代码,(即,我只能将指针传递给它约),除了的实现其操作的代码,可以看到它的真正定义。 (您可以使用不透明类型的单独名称,但这并不具有真正的优势。)

1

C中的非typedefed结构体名称需要在所有类型名称都使用前加上“struct”,因此大多数人使用typedef为不需要始终添加struct关键字的类型创建新名称。

这样做的原因是代码的可读性,减少键入以及可能的清晰度,但typedefs实际上可能会遮掩有关指针类型的信息。

诚实地说,需要typedef为结构创建新名称是一种遗迹,而C99并没有遵循C++的先导并将其删除,这是一种耻辱。

+0

C99不能摆脱'typedef'来摆脱'struct'因为后退兼容性。有很多代码像'struct Foo {...}; typedef ... Foo;'这将停止编译。 – JeremyP 2012-08-01 16:18:47

4

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

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

+0

我猜想这可能简化了第一批编译器中的内存分配,当所有内容都适合128k或更少的数据空间时,这是非常重要的。事实上,在最早的C编译器中,结构成员名称也有一个* global *名称空间。这意味着'struct foo'和'struct bar'不能同时拥有一个名为'x'的成员,这个成员直接导致了结构成员的小标题样式('f_x','b_x') C代码。 – 2010-04-11 21:46:54

+0

@Dave:我认为你是对的。有些东西正在冒着结构成员的名字吸烟。时间太长了,我很久以前就把这个脑细胞放在了不理想的角落里。哇,他为什么要? B' – 2010-04-11 21:57:43

2

它只是代码的可读性。 typedef只是为数据类型提供新名称。你可以用你想要的方式和无论你在哪里使用int来命名int,而只需用你赋予的新名称替换它。同样的事情也适用于结构。

0

我实际上并没有对结构使用typedef。 为什么? 因为我会使用一些约定,如s_前缀,以便轻松看到我在看什么样的变量。

由于我使用了大量的抽象数据类型,我猜想使用typedef是一个好主意,这样用户才会真正使用它作为不透明类型。 但实际上我总是在实现中使用一个结构体。