我正在研究用于ARM低功耗设备的C语言应用程序,我首先要有这段代码
struct state {
float position;
int dummy;
};
注意这个结构没有定义一个新类型,我也注意到稍后在代码中这个结构就像这样使用
struct state mystate;
这对我来说很奇怪而且不方便,不灵活,还有一个额外无用的关键字,我可以轻松避免在结果中首先使用typedef
。
这是一个对于此应用程序的业务逻辑至关重要的结构,并且在源代码中也经常使用。
有一个特殊的原因是不使用typedef
结构最终被用作类型?
答案 0 :(得分:12)
我认为typedef有害。我认为它几乎总是误用。在我看来,它是有用的,只有当底层类型被完全抽象时才有用 - 例如所有操纵都是通过功能。否则,底层类型不是抽象的 - 用户仍然必须知道它是什么,理解代码 - 所有发生的事情都是代码可读性受损,其中类型命名空间没有增益(对于类型)没有得到适当的抽象扩展。
在我看来,几乎所有使用typedef都不了解它带来的问题以及它应该如何使用。
答案 1 :(得分:4)
这里没有提到的细节,来自C标准。
6.7.7.3 [...] typedef声明不引入新类型,只引用所指定类型的同义词。
你可以用它来抽象出一些细节,但是当有人走到只允许函数调用的极端时,我想知道他们是如何在size_t
处分配内存以及它是unsigned int的泄漏知识类型是必要的。
鉴于它只是一个别名,我也没有使用typedef作为快捷方式的任何问题,例如省略在任何地方都需要的附加关键字。我不喜欢重复的样板代码,并将其隐藏起来会缩短代码。您应该小心谨慎,清晰度和可读性不会受到影响,因此我也更喜欢始终保持名称空间的清洁。我发现这很糟糕:
typedef struct state {
float position;
int dummy;
} state;
并且喜欢这样的东西:
typedef struct s_state {
float position;
int dummy;
} t_state;
答案 2 :(得分:3)
使用typedef
与否是个人偏好。就个人而言,我只使用typedef
来表示复杂的指针类型或函数指针。
声明结构时,还要声明一个类型,即struct structName
。所有typedef都允许您在此场景中取出定义的struct
部分,而不是必需的。这与低功耗设备无关。
答案 3 :(得分:3)
这主要是为了清晰起见。实际上,大多数人都知道,如果你必须使用struct关键字,你应该自己操纵内部数据。当结构类型为typedef时,它是隐藏实际类型,操作应该由函数完成。这是一个并不总是遵循的约定,其他的只是留下struct关键字以区别于不透明类型。