例如,旧gethostbyname
Posix函数返回的结果。它的返回类型是struct hostent *
,但有时它会返回一个指向结构的指针,该结构具有相同的元素,但最后会添加一些元素。如果要访问额外的东西,可以将结果转换为指向实际类型的指针。最终结果有点像在OO语言中返回声明的返回类型的子类的对象。
是否有这种"子类化的名称"在C?它被认为是一种好习惯吗?
答案 0 :(得分:3)
如果创建两种类型的并集,则开头的成员将形成“公共初始序列”。该标准特别允许您通过任何成员访问该公共初始序列的成员(C99,§6.5.2.3/ 5):
为了简化联合的使用,我们做了一个特别的保证:如果一个联合包含几个共享一个共同初始序列的结构(见下文),并且如果联合对象当前包含这些结构中的一个,则允许检查其中任何一个的共同初始部分,可以看到完整类型的联合声明。如果对应的成员具有一个或多个初始成员的序列的兼容类型(并且对于位字段,具有相同的宽度),则两个结构共享公共初始序列。
答案 1 :(得分:2)
同样的想法在Pascal中被称为“变体”记录。实现这一点的更好方法是为公共初始序列定义结构,并使变量声明该结构的前缀元素。但这通常没有完成,可能是因为在初始struct成员的引用中有额外的名称。 (误)使用预处理器并包含前缀struct或其他技巧只是为了避免命名常用值。
或者,变体部分可以命名为子结构,然后可以在结构的末尾声明这些变体部分的并集。请记住,C是一种类型语言和系统语言,因此开发人员经常尝试编写(大多数)遵守类型规则的简短代码。
答案 2 :(得分:1)
我相信这叫做type punning。
在计算机科学中,类型双关语是任何编程技术的常用术语,它颠覆或绕过编程语言的类型系统,以达到在形式语言的范围内难以或不可能实现的效果。
在C和C ++中,提供类型转换,
union
和reinterpret_cast
等构造,以允许多种类型的惩罚,尽管标准语言实际上不支持某些类型。
至于是否良好实践,它对结构中数据的对齐做出了某些假设,但这很少成为问题。如果两个结构的对齐不同,则可能发生严重错误。
如果使用真正的继承,就像在C ++中一样,不存在不兼容对齐的危险,效率也完全相同。