这种风格:
struct _something
{
...
};
typedef struct _something someting;
和那种风格:
typedef struct _something
{
...
} something;
是C中正确的typedef声明。
请注意,标头文件中存在结构声明是故意的:我需要可以访问其他地方的结构的内部组件。
第一个声明的一个缺点是,当您使用任何IDE时,自动“跳转到声明”通常会将您引导至typedef struct _something someting;
,而不是直接为您提供真实的结构定义。
在第二种方法中,您可以直接进入结构定义。
是否有人会使用第一种方法?
我正在处理的代码充满了这些...
它只是维护者的坏/好习惯吗?
答案 0 :(得分:4)
分离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` */
};
此封装的优点是您可以更改内部结构,而无需重新编译应用程序的其余部分。如果您使用动态库,可以派上用场。
答案 1 :(得分:3)
This discussion thread概述了该主题,并强调了使用第一种风格的重要原因:
此样式分隔类型定义(不 typedef的作用) 来自typename同义词创建(是 typedef的作用),并保留 没有类型名称和类型同义词之间的强烈对应关系 两者使用相同名称的缺点(这可能会混淆一些 调试器,无论如何都是grep的痛苦。)
答案 2 :(得分:1)
没有技术上的理由可以选择两种类型的结构。
有些人可能会使用第一种方法,因为他们分别学习了typedef和结构声明,而他们只是没有将它们组合起来。或许他们的IDE更喜欢另一种形式。
或者在功能强大的IDE可用之前,可能会有一种奇思妙想的编码风格。
答案 3 :(得分:1)
如果你将这两件事分开(typedef与struct声明),你可以根据需要拥有opaque pointers。
将不透明指针视为在特定结构中封装信息的原始方式,而不让用户访问内部信息。
另请阅读@tristopia的回答。
答案 4 :(得分:0)
定义结构时:
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放在一个头文件中,这样他们就可以输入构造结构,指向结构的指针等等。
答案 5 :(得分:0)
有时您可能想为单一类型创建多个同义词。在这种情况下,您最好使用第一种方法,因为这会在一个地方为您提供所有同义词,即typedef。