为什么不在C中使用typedef作为结构?

Ken*_*Ken 5 c struct typedef

我正在研究用于ARM低功耗设备的C语言应用程序,我首先要使用这段代码

struct state {
    float position;
    int dummy;
};
Run Code Online (Sandbox Code Playgroud)

注意这个结构没有定义一个新类型,我也注意到稍后在代码中这个结构就像这样使用了

struct state mystate;
Run Code Online (Sandbox Code Playgroud)

这是奇怪的,对我来说不方便,不灵活,还有一个额外无用的关键字,我可以轻松避免只使用typedef结构.

这是一个对于此应用程序的业务逻辑至关重要的结构,并且在源代码中也经常使用.

没有使用typedef结构最终用作类型的特殊原因?

小智 12

我认为typedef有害.我认为它几乎总是误用.在我看来,它是有用的,只有当底层类型被完全抽象时才有用 - 例如,所有操作都是通过函数进行的.否则,底层类型不是抽象的 - 用户仍然必须知道它是什么,理解代码 - 所有发生的事情都是代码可读性受损,其中类型命名空间没有增益(对于类型)没有得到适当的抽象扩展.

在我看来,几乎所有使用typedef都不了解它带来的问题以及它应该如何使用.

  • 如果有抽象,抽象只是抽象.考虑.假设你输入一个整数.然后,您稍后使用加法运算符.*你刚刚破解了抽象*.用户必须知道基础类型或他无法理解代码 - 所以他现在必须记住另一种类型.这种失败是普遍存在的.我见过代码库,它们会输入几十种类型,然后打破抽象 - 噩梦.使用typedef唯一真正的抽象是当所有操作通过函数调用发生时; 用户永远不必知道底层类型. (4认同)
  • 不,在 typedef 后面抽象类型的想法是在程序中 __introduce__ 语义。`size_t`、`off_t` 甚至 `time_t` 都是 typedefed 基类型,但它们在程序中引入了更高级别的含义。这会增加(通常显着)程序的可读性。 (4认同)
  • @Jim:我认为把它称为宗教问题是盲目的.事实上,它不是 - 有一套明显的优点,缺点和误用.整数示例说明了违反抽象的误用,这是typedef的主要失败; 这是一回事.就我所见,对结构使用typedef没有任何理由.结构已经有一个类型,因此不需要typedef; 并且不完整的类型提供抽象.typedef对结构的唯一影响是增加代码的逻辑复杂性. (3认同)
  • “我认为将其称为宗教问题是盲目的”——你错了,这是人身攻击。“所以这是一回事”——正如我所说,这与 OP 的问题无关。“就我所见,对结构使用 typedef 没有任何理由”——它有一个由 OP 陈述的明显理由……它避免了对结构噪音词的需要。'typedef 对结构的唯一影响是增加代码的逻辑复杂性'——它没有这样做;它在代码中添加了两个标记,同时允许删除许多其他标记,并且对逻辑没有影响。我的最后一句话。 (3认同)

Sec*_*ure 6

这里没有提到的一个小细节,来自 C 标准。

6.7.7.3 [...] typedef 声明不引入新类型,仅引入如此指定类型的同义词。

您可以使用它来抽象一些细节,但当有人走到只允许函数调用的极端时,我想知道他们如何分配内存,其中 asize_t和泄漏的知识是 unsigned int 类型是必要的。

鉴于它只是一个别名,我在将 typedef 用作快捷方式时也没有任何问题,例如省略任何地方都需要的附加关键字。我不喜欢重复的样板代码,将其隐藏起来会使代码更短。你应该小心一点,不要影响清晰度和可读性,所以我也更喜欢始终保持命名空间干净。我觉得这很糟糕:

typedef struct state {
    float position;
    int dummy;
} state;
Run Code Online (Sandbox Code Playgroud)

而更喜欢这样的东西:

typedef struct s_state {
    float position;
    int dummy;
} t_state;
Run Code Online (Sandbox Code Playgroud)

  • 你根本不需要命名结构...... `typedef struct { float position; 国际假人; } State;` ... 所以您只需在结构声明中添加一个标记,并从每次使用该类型时删除一个标记。这显然是明智的做法,纯粹是语法问题,没有提出有效的反对意见。(对其他一些 typedef 的反对可能是有效的,但与 OP 关于 struct 的问题无关。) (2认同)

Jes*_*mos 5

这主要是为了清楚起见。在实践中,人们普遍认为,如果必须使用 struct 关键字,则应该自己操作内部数据。当结构被类型定义时,它是为了隐藏实际类型,并且操作应该由函数完成。这是一个并不总是遵循的约定,其他人只是保留 struct 关键字以将其与不透明类型区分开。

  • @wildplasser:完全正确。我*不*喜欢typdef。它们只有在底层类型完全抽象时才有用,例如由且仅由函数操作 - 而这种情况几乎永远不会发生。据我所知,人们使用typdef是因为他们看到其他人使用它,但不了解它的问题或应该如何使用它。 (3认同)
  • 我想我们同意。函数指针就是一个明显的例子。但这主要是由于精神理智的需要造成的;-) (2认同)
  • Typedef 对于锁类型 (spinlock_t)、pthread (pthread_t) 等很有意义……当所有操作都是通过 API 完成并且您本质上需要实际数据的“句柄”时。另外问题主要是关于结构和 typedef。 (2认同)