从C结构继承的可能的兼容性问题

时间:2012-11-08 18:51:37

标签: c++ c language-interoperability

背景:我们正在用C ++实现一个动态库,它扩展了C程序的功能。对于C程序中使用的主要结构之一,我们想添加自己的库特定字段。目前,当我们需要一个新领域时,我们很好地问,C程序的开发人员为我们添加了一个字段,最终我们得到了大量的混乱。我想知道我们是否可以做以下事情:

主程序的头文件:

#ifdef __cplusplus
extern "C" {
#endif
/* ... */
typedef struct ImportantStruct {
/* Definitions */
} ImportantStruct
/* ... */
#ifdef __cplusplus
}
#endif

我们的标题文件:

//...
class ObjectType : public ImportantStruct {
// Our extra fields
}
//...

我想我有两个问题:

1)这是否合法?

2)当C程序试图使用对象的struct部分时会产生什么问题?

2 个答案:

答案 0 :(得分:1)

由于ImportantStruct是一个POD结构(自动它具有标准布局),并且由于ObjectType没有其他基本类型,并且如果它没有虚拟方法,它也有一个标准布局。因此,它可以在C中用作结构。

  

1)这是否合法?

是的,是的。

  

2)当C程序试图使用对象的struct部分时会产生什么问题?

如果您的c函数没有尝试覆盖它,那么您是安全的。你可以像这样覆盖它:

void foo( struct ImportantStruct *s )
{
 memset( s,0, sizeof(*s) );
}

如果是,那么它取决于ImportantStruct中的内容,以及是否有填充字节。

这样的结构:

typedef struct {
  int a;
  char b;
} ImportantStruct;

在制作基类时可能会删除填充字节。

无论如何,我会使用构图,避免任何问题。但是你必须确保它是第一个成员,并且ObjectType具有标准布局。

答案 1 :(得分:0)

派生的方法应该有效,只需记住产生的对齐方式。 我不会对“扩展”POD中的结果大小/偏移做出假设。某些编译器可能会删除基类的填充。因此派生的C ++ POD可能与resp的大小不同。扩展平面C结构。

有关派生对象布局的更多详细信息:c-data-alignment-member-order-inheritance

另外,为了扩展POD,您可以使用struct关键字class。没有太大区别,只是结构成员默认是公共的。 它也表达了你的POD意图(虽然没有强制执行)。