背景:我们正在用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部分时会产生什么问题?
答案 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意图(虽然没有强制执行)。