繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM