6

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

struct state {
    float position;
    int dummy;
};

注意这个结构没有定义一个新类型,我也注意到在后面的代码中这个结构是这样使用的

struct state mystate;

这对我来说很奇怪,不方便,不灵活,并且有一个额外的无用关键字,我可以很容易地避免typedef首先将其用于结构。

这是一个对该应用程序的业务逻辑至关重要的结构,并且在源代码中也被大量使用。

typedef不使用最终用作类型的结构有一个特殊的原因吗?

4

4 回答 4

12

我认为 typedef 有害。我认为它几乎总是被误用。在我看来,它是有用的,并且仅在底层类型被完全抽象时才有用 - 例如,所有操作都是通过函数进行的。否则,底层类型不会被抽象——用户仍然必须知道它是什么,才能理解代码——所发生的只是代码可读性受损,类型命名空间没有获得收益(对于类型未正确抽象)扩展。

在我看来,几乎所有对 typedef 的使用都缺乏对它带来的问题以及应该如何使用它的理解。

于 2012-09-14T01:28:09.617 回答
6

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

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

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

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

typedef struct state {
    float position;
    int dummy;
} state;

而是更喜欢这样的东西:

typedef struct s_state {
    float position;
    int dummy;
} t_state;
于 2012-09-14T06:06:04.360 回答
4

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

于 2012-09-14T01:19:24.810 回答
3

使用typedef与否是个人喜好。就个人而言,我只typedef用于复杂的指针类型或函数指针。

当你声明一个结构时,你也声明了一个类型,即struct structName. typedef 所做的只是允许您struct在这种情况下取​​出定义的一部分,并且不是必需的。这与低功率设备完全无关。

于 2012-09-14T01:18:32.653 回答