gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:53:08 25 4
gpt4 key购买 nike

背景:我们正在用 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 程序试图使用对象的结构部分时,这会产生什么问题?

最佳答案

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

1) Is this even legal?

是的,是的。

2) What problems does this create when the C program tries to use the struct part of the object?

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

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

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

这样的结构:

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

在创建基类时可能删除了填充字节。

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

关于c++ - 从 C 结构继承的可能的兼容性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13295750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com