我当前的项目是一个中型库,旨在同时具有 C 和 C++ 接口。它以我希望从 C 和 C++ 函数访问的单一数据类型为中心,因为我想鼓励第三方通过用任何一种语言编写函数来扩展库。
我了解 C/C++ 混合的基础知识(例如比较http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html)并提出了以下解决方案:
我的基本设计围绕在 C 中创建一个所有数据都暴露的结构(这是我的 C 程序员所期望的)并从中派生一个隐藏成员访问的类,希望为 C++ 程序员更安全地访问该结构。问题来自推导:我想在 C++ 中使用命名空间并隐藏 C 接口。当然,C 结构本身不能隐藏(不使用 PIMPL 习语),但这对我来说很好。
以下示例代码在 C 和 C++“客户端”程序中编译和运行时没有明显错误。但是,我想知道这个解决方案是否有效或者是否有更好的解决方案。
示例代码:
#ifdef __cplusplus__
extern "C" {
#endif
struct base
{
char * data;
}
#ifdef __cplusplus__
} // extern "C"
namespace {
extern "C" {
#endif
/* cleanly initialize struct */
struct base * new_base (struct base *);
/* cleanly destroy struct */
void del_base (struct base *);
#ifdef __cplusplus__
} } // namespace, extern "C"
#include<new>
namespace safe {
class base_plus : private base
{
public:
base_plus ()
{
if (! new_base(this))
throw std::bad_alloc ();
}
~base_plus ()
{
del_base (this);
}
};
} // namespace safe
#endif