【问题标题】:Why should structure names have a typedef?为什么结构名称应该有 typedef?
【发布时间】:2023-03-19 14:03:01
【问题描述】:

我见过源代码总是有一个结构的 typedef 并且在任何地方都使用相同的,而不是直接使用结构名称作为“struct sname”等?

这背后的原因是什么?这样做有什么好处吗?

【问题讨论】:

  • 在他的书Expert C Programming 中,Peter van der Linden 提出了结构的 typedef 没有用的案例,你不应该打扰。我喜欢这个。 typedef 所做的只是让你在声明和原型等几个地方不用写struct。这不值得混淆。我想立即知道何时必须使用->.。 Typedef 让这变得更加困难。

标签: c struct typedef


【解决方案1】:

Box b;struct boxtype b; 更容易阅读

typedef struct _entry{
   char *name;
   int id;
} Entry, *EntryP;

优势:
在上面的typedef 中,EntryEntryP 都与struct _entry 分开定义。
因此,EntryP firstentry 可以用来代替struct _entry *firstentry,并且在脑海中解析起来更简单。

注意:它不像结构名称应该typedefined,但显然它更容易阅读。此外,Entry *EntryP 的使用完全取决于用户。

【讨论】:

  • 我通常反对像EntryP 这样的typedef。 C 已经有一个非常好的方法来声明你想要的指针:Entry *firstentry
  • @Hagglund:没有什么好争论的:)。这完全是主观的,有人可能喜欢EntryP,而其他人可能喜欢Entry *
  • 我同意它是主观的,但我认为它不推荐,因为它无缘无故地抽象出firstentryEntry * 类型的事实。尽管EntryP 中的“P”是为了强调“指向”,但它仍然是模棱两可的,而Entry * 不是。无论如何,我相信你的struct entry *firstentry 应该是struct _entry *firstentry,注意下划线
【解决方案2】:

这是 C 语言中的一个奇怪的怪癖,结构标记名称存储在不同的命名空间(符号表)中。 C++ 语言摆脱了这种行为。 typedef 为全局命名空间中的结构类型创建别名。因此,您不必在结构名称前输入“struct”。

不确定 Ritchie 在定义这种行为时抽的是什么烟。我猜测早期版本的编译器中的解析器存在某种问题。

【讨论】:

  • 我猜这可能简化了第一个编译器中的内存分配,当所有东西都必须适合 128k 或更少的数据空间时,这很重要。事实上,在最早的 C 编译器中,结构成员名称也只有一个 global 命名空间。这意味着struct foostruct bar 不能同时拥有一个名为x 的成员,这直接导致结构成员的taglet 样式(f_xb_x),这在今天的某些C 代码中很常见.
  • @Dave:我认为你是对的。结构成员的名字在冒烟。太久了,我早就把那个脑细胞放在了无视角。哇,他为什么要这么做?乙?
【解决方案3】:

我喜欢在 C 中这样做:

// in a "public" header file
typedef struct Example Example;

// in a "private" header or a source file
struct Example { ... };

像这样,我在整个代码中都将Example 作为不透明类型(即,我只能传递指向它的指针),except 用于实现其操作的代码,可以看到它的真正定义是什么。 (您可以为 opaque 类型使用单独的名称,但这并没有真正的优势。)

【讨论】:

    【解决方案4】:

    它只是为了代码的可读性。 typedefs 只是为数据类型提供新名称。与其在每个可以按您想要的方式命名它的地方给出 int ,而且在您使用 int 的任何地方都可以用您给定的新名称替换它。同样的事情也适用于结构。

    【讨论】:

      【解决方案5】:

      这是一种信息隐藏形式,在创建不透明类型时很有用。请参阅 this SO link 以获得稍长的答案。

      【讨论】:

        【解决方案6】:

        C 中的非类型定义结构名称要求在使用类型名称的任何地方都添加“struct”,因此大多数人使用 typedef 为不需要在所有类型名称前添加 struct 关键字的类型创建一个新名称时间。

        这样做的原因是代码的可读性、减少的输入和可能的清晰度,但 typedef 实际上会掩盖有关指针类型的信息。

        老实说,需要 typedef 来为结构创建新名称是一个遗留问题,很遗憾 C99 没有遵循 C++ 的领导并删除它。

        【讨论】:

        • C99 无法摆脱必须 typedef 摆脱 struct 因为向后兼容性。有很多像 struct Foo {...} ; typedef ... Foo; 这样的代码会停止编译。
        【解决方案7】:

        我实际上不将 typedef 用于结构。 为什么? 因为无论如何我都会使用一些约定,例如 s_ 前缀,以便轻松查看我正在查看的变量类型。

        由于我使用了很多抽象数据类型,我想使用 typedef 是个好主意,这样用户才能真正将它用作不透明类型。 但实际上我总是在实现中使用结构体。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-17
          • 2020-08-13
          • 1970-01-01
          • 2018-12-20
          • 2015-12-01
          • 1970-01-01
          • 2019-06-02
          • 2011-07-06
          相关资源
          最近更新 更多