我正在研究用于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都不了解它带来的问题以及它应该如何使用.
这里没有提到的一个小细节,来自 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)
这主要是为了清楚起见。在实践中,人们普遍认为,如果必须使用 struct 关键字,则应该自己操作内部数据。当结构被类型定义时,它是为了隐藏实际类型,并且操作应该由函数完成。这是一个并不总是遵循的约定,其他人只是保留 struct 关键字以将其与不透明类型区分开。