0

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

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

4

3 回答 3

3

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

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

于 2013-10-03T00:45:42.967 回答
2

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

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

于 2013-10-03T02:24:16.937 回答
1

我相信这被称为类型双关语

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

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

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

如果使用真正的继承,就像在 C++ 中那样,就不存在对齐不兼容的危险,而且效率是完全一样的。

于 2013-10-03T00:29:42.237 回答