为什么在* struct定义之后使用typedef *?

时间:2010-07-30 11:56:02

标签: c struct typedef

这种风格:

struct _something
{
   ...
};
typedef struct _something someting;

和那种风格:

typedef struct _something
{
  ...
} something;

是C中正确的typedef声明。
请注意,标头文件中存在结构声明是故意的:我需要可以访问其他地方的结构的内部组件。

第一个声明的一个缺点是,当您使用任何IDE时,自动“跳转到声明”通常会将您引导至typedef struct _something someting;,而不是直接为您提供真实的结构定义。

在第二种方法中,您可以直接进入结构定义。

是否有人会使用第一种方法?
我正在处理的代码充满了这些...
它只是维护者的坏/好习惯吗?

6 个答案:

答案 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。