回答
及其读取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 *
与EntryP
完全取决于用户。
我通常反对类似于'EntryP'的typedefs。 C已经有了一个完美的方式来声明你想要的指针:'Entry * firstentry'。 – 2010-04-11 21:40:14
@Hagglund:没有什么可以争论的:)。它完全是主观的,可能会喜欢'EntryP',而其他可能会喜欢'Entry *'。 – 2010-04-11 22:35:16
我同意它是主观的,但我不得不认为它不被推荐,因为它没有理由地抽象出'firstentry'类型为'Entry *'的事实。虽然'EntryP'中的'P'是为了强调'指向',但它仍然不明确,而'Entry *'不是。在任何情况下,我相信你的行'struct entry * firstentry'应该是'struct_entry * firstentry',注意下划线 – SiegeX 2010-05-12 00:08:50
这是一种隐藏信息的形式,在创建不透明类型时非常有用。请参阅this SO link稍微长一点的答案。
我喜欢做这在C:
// in a "public" header file
typedef struct Example Example;
// in a "private" header or a source file
struct Example { ... };
这样,我有Example
为不透明的类型在我的代码,(即,我只能将指针传递给它约),除了的实现其操作的代码,可以看到它的真正定义。 (您可以使用不透明类型的单独名称,但这并不具有真正的优势。)
C中的非typedefed结构体名称需要在所有类型名称都使用前加上“struct”,因此大多数人使用typedef为不需要始终添加struct关键字的类型创建新名称。
这样做的原因是代码的可读性,减少键入以及可能的清晰度,但typedefs实际上可能会遮掩有关指针类型的信息。
诚实地说,需要typedef为结构创建新名称是一种遗迹,而C99并没有遵循C++的先导并将其删除,这是一种耻辱。
C99不能摆脱'typedef'来摆脱'struct'因为后退兼容性。有很多代码像'struct Foo {...}; typedef ... Foo;'这将停止编译。 – JeremyP 2012-08-01 16:18:47
这是C语言中一个奇怪的怪癖,结构标记名称存储在不同的名称空间(符号表)中。 C++语言摆脱了这种行为。 typedef为全局名称空间中的结构类型创建一个别名。所以你不必在结构名称之前输入“struct”。
不确定里奇在定义这种行为时吸烟的是什么。我在编译器的早期版本中猜测解析器存在某种问题。
我猜想这可能简化了第一批编译器中的内存分配,当所有内容都适合128k或更少的数据空间时,这是非常重要的。事实上,在最早的C编译器中,结构成员名称也有一个* global *名称空间。这意味着'struct foo'和'struct bar'不能同时拥有一个名为'x'的成员,这个成员直接导致了结构成员的小标题样式('f_x','b_x') C代码。 – 2010-04-11 21:46:54
@Dave:我认为你是对的。有些东西正在冒着结构成员的名字吸烟。时间太长了,我很久以前就把这个脑细胞放在了不理想的角落里。哇,他为什么要? B' – 2010-04-11 21:57:43
它只是代码的可读性。 typedef只是为数据类型提供新名称。你可以用你想要的方式和无论你在哪里使用int来命名int,而只需用你赋予的新名称替换它。同样的事情也适用于结构。
我实际上并没有对结构使用typedef。 为什么? 因为我会使用一些约定,如s_
前缀,以便轻松看到我在看什么样的变量。
由于我使用了大量的抽象数据类型,我猜想使用typedef是一个好主意,这样用户才会真正使用它作为不透明类型。 但实际上我总是在实现中使用一个结构体。
- 1. Typedef有和没有结构名称
- 2. typedef结构和枚举,为什么?
- 3. typedef结构与*的名称在c
- 4. Typedef结构未知类型名称
- 5. 为什么需要typedef GLXContext?
- 6. typedef一个结构到与结构相同名称的点
- 7. XML为什么要有结构?
- 8. 具有以下行为的LIFO结构的名称是什么?
- 9. 这种结构的名称是什么?
- 10. foward typedef结构
- 11. 的typedef结构
- 12. 结构用typedef
- 13. 为什么使用typedef来声明结构?
- 14. 为什么要返回令牌名称?
- 15. 为什么结构标签不是C中的类型名称?
- 16. typedef有什么用?
- 17. C++ - 与对象名称typedef结构的正向声明
- 18. Typedef名称与C++中的结构标记冲突
- 19. 命名线程,使用typedef /结构
- 20. 为什么有时会看到Java包名称与文件夹结构不同?
- 21. Typedef结构理解
- 22. typedef结构指针
- 23. 使用typedef结构
- 24. typedef结构用法
- 25. typedef结构问题
- 26. 为什么typedef没有强类型?
- 27. 在结构中声明匿名结构有什么用处?
- 28. 如何检查typedef结构的内部typedef结构是否为NULL?
- 29. 为什么我的结构和模板的名称以“ - 未知”结尾?
- 30. 为什么不需要添加所有名称?
在他的书* Expert C Programming *中,Peter van der Linden指出结构的typedef是无用的,你不应该打扰。我喜欢这个。 typedef的所有功能都可以节省你在''struct''这样的几个地方写入'struct'',比如声明和原型。这是不值得的混淆。我想立刻知道何时必须使用' - >'或'.'。 Typedefs使这更难。 – Jens 2017-08-20 14:19:33