【问题标题】:What is it called when you have two C structures that have the same first elements?当你有两个具有相同第一个元素的 C 结构时,它叫什么?
【发布时间】:2013-10-09 12:59:33
【问题描述】:

例如,旧的gethostbyname Posix 函数返回的结果。它的返回类型是struct hostent *,但有时它会返回一个指向结构的指针,该结构具有相同的元素,但在末尾添加了更多元素。然后,如果您想访问额外的东西,您可以将结果转换为指向真实类型的指针。最终结果有点像在 OO 语言中返回声明返回类型的子类的对象。

C 中有这种“子类化”的名称吗?它被认为是一种好的做法吗?

【问题讨论】:

  • “联合”是一种方法。
  • 我不认为它有一个成熟的名字,但它被广泛使用。我能想到的第一个例子是sockaddr & sockaddr_in

标签: c struct terminology


【解决方案1】:

如果创建这两种类型的联合,则开头的成员形成“公共初始序列”。该标准特别允许您通过任何这些成员(C99,第 6.5.2.3/5 节)访问该公共初始序列的成员:

为了简化联合的使用,我们做了一个特殊的保证:如果联合包含多个共享相同初始序列的结构(见下文),并且如果联合对象当前包含这些结构之一,则允许在联合体的完整类型的声明可见的任何地方检查它们中任何一个的公共初始部分。如果对应的成员对于一个或多个初始成员的序列具有兼容的类型(并且对于位域,具有相同的宽度),则两个结构共享一个共同的初始序列。

【讨论】:

    【解决方案2】:

    同样的想法在 Pascal 中被称为“变体”记录。实现这一点的更好方法是为公共初始序列定义一个结构,并让变体声明该结构的前缀元素。但这通常不会这样做,并且可能是因为对初始结构成员的引用中有额外的名称。 (错误)使用预处理器并包含前缀结构,或其他技巧只是为了避免命名公共值。

    或者,可以将变体部分命名为子结构,然后可以在结构的末尾声明这些变体部分的联合。请记住,C 是一种类型语言,也是一种系统语言,因此开发人员经常尝试编写(大部分)遵循类型规则的简短代码。

    【讨论】:

      【解决方案3】:

      我相信这叫type punning

      在计算机科学中,类型双关语是任何编程技术的常用术语,它颠覆或规避编程语言的类型系统,以实现在形式语言范围内难以或不可能实现的效果。

      在 C 和 C++ 中,提供了诸如类型转换、unionreinterpret_cast 之类的结构,以便允许多种类型的双关语,尽管标准语言实际上不支持某些类型。

      至于这是否是好的做法,它对结构中数据的对齐做出了某些假设,但这很少成为问题。如果两个结构的对齐方式不同,则可能会出现严重错误。

      如果使用真正的继承,和C++一样,不存在对齐不兼容的危险,效率完全一样。

      【讨论】:

      • 谢谢! “类型双关语”正是我正在寻找的术语。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 2016-12-30
      • 2015-03-21
      • 2018-03-23
      相关资源
      最近更新 更多