c - 为什么使用 typedef *after* 结构定义?

标签 c struct typedef

这两种风格:

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类型的声明,不知道它是如何实现的。您现在可以声明作为接口(interface)一部分的函数,而无需透露结构内部的任何内容。只需要传递指向该 typename 的指针即可。

在你的“类”的实现文件中(我把它放在引号中,因为我们在这里纯粹是在 C 环境中讨论),你这样做:

#include "header.h"

struct whatever {
  ...
  ...
  /* can even contain references to `struct whatever` or even `typename` */
};

这种封装的优点是您可以更改内部结构而无需重新编译应用程序的其余部分。如果您使用动态库,可以派上用场。

关于c - 为什么使用 typedef *after* 结构定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3371169/

相关文章:

c - 为什么C与正则表达式匹配时不捕获任何子字符串

c# - AVR32 UC3 USB 在 cdc 设备模式下数据丢失

c - 指针魔术: structs with pointer members and more

c - 指向结构的指针

c - 关于 `size_t`和它们测量的指针类型

c - 为什么我的图像与我期望的不符?

c - 使用 'dummy' 指针仅用于比较

c# - 初始化 Struct 内的数组(字符串或任何其他数据类型)

c - 请解释 typedef 的用法

C-Qsort : Sort name in ascending order and grade in descending order