[英]Why using a typedef *after* struct definition?
这两种风格:
struct _something
{
...
};
typedef struct _something someting;
那种风格:
typedef struct _something
{
...
} something;
是C中正确的typedef声明
请注意, 头文件中存在结构声明是有目的的:我需要访问其他地方的结构的内部组件。
第一个声明的一个缺点是当你使用任何IDE时,自动“跳转到声明”通常会引导你进入typedef struct _something someting;
而不是直接给你真正的结构定义。
在第二种方法中,您可以直接进入结构定义。
是否有人会使用第一种方法?
我正在处理的代码充满了这些......
它只是维护者的坏/好习惯吗?
分离typedef和struct声明有一个明显的优点,如果你在不同的文件中将两者分开,那么这种优势很明显。 它允许数据封装。
你在头文件中声明了你的
typedef struct whatever typename;
这是一种struct whatever
类型的声明,不知道它是如何实现的。 您现在可以声明属于该接口的函数,而不会从结构的内部显示任何内容。 传递指向该typename
名称的指针就是所需要的。
在你的“类”的实现文件中(我把它放在引号中,因为我们在这里纯粹是在C语境中讨论),你这样做:
#include "header.h"
struct whatever {
...
...
/* can even contain references to `struct whatever` or even `typename` */
};
这种封装的优点是您可以更改内部结构,而无需重新编译应用程序的其余部分。 如果您使用动态库,可以派上用场。
此讨论主题提供了对主题的良好概述,并突出显示使用第一个样式的重要原因:
这种样式将类型定义( 不是 typedef所做的)与typename同义词创建(这是 typedef所做的)分开,并保留了类型名称和类型同义词之间的强相关性,而没有为两者使用相同名称的缺点(这可能会混淆)一些调试器,无论如何都是grep的痛苦)。
没有技术上的理由可以选择两种类型的结构。
有些人可能使用第一种方法,因为他们分别学习了typedef和结构声明,而他们只是没有组合它们。 或许他们的IDE更喜欢另一种形式。
或者在强大的IDE可用之前,可能会有一种奇思妙想的编码风格。
如果将两个东西(typedef与struct声明)分开,则可以根据需要使用不透明的指针 。
将不透明指针视为在特定结构中封装信息的原始方式,而不让用户访问内部信息。
另请阅读@ tristopia的回答。
定义结构时:
struct something
{
...
};
您已经创建了一个名为“struct something”的新类型。
你可以在你的应用程序中使用这个:
struct something myvar;
但大多数人不喜欢输入struct(特别是有很多指针):
struct something *test = (struct something*)malloc(sizeof(struct something))
所以你可以输入它(以你描述的任何一种方式):
struct something
{
...
};
typedef struct _something someting;
要么
typedef struct _something
{
...
} something;
这样,当您使用结构时,您可以这样做:
something *test = (something*)malloc(sizeof(something))
至于你定义它的方式,它并不重要。
有些人喜欢将所有的typedef放在一个头文件中,这样他们就可以输入构造结构,指向结构的指针等。
有时您可能想为单一类型创建多个同义词。 在这种情况下,您最好使用第一种方法,因为这会在一个地方为您提供所有同义词,即typedef。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.