【发布时间】:2012-10-29 01:05:33
【问题描述】:
背景:我们正在用 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 部分时,这会产生什么问题?
【问题讨论】:
-
如果你只使用组合而不是继承,听起来生活会容易得多......
-
你将如何处理你的 C 结构?您只是导入 C 结构吗?通常,从 C 结构继承是可以的 - 请记住
extern "C"中的 C 代码由 C++ 编译器解析... -
我在理论上同意组合将是一个非常非常好的解决方案。如果我从头开始做这件事,我会立即使用合成。问题是我们目前有一个
typedef ImportantStruct ObjectType和许多直接访问字段的地方。如果我将 typedef 更改为继承,这些访问仍然是合法的,并且我可以更好地控制对象的生命周期。但是,由于组合可能有其他直接优势,我肯定会重新考虑它作为一种选择。
标签: c++ c language-interoperability