gpt4 book ai didi

c++ - 如何在 C 和 C++ 中设计具有并行接口(interface)的库

转载 作者:太空宇宙 更新时间:2023-11-04 02:11:44 28 4
gpt4 key购买 nike

我当前的项目是一个中型库,旨在同时具有 C 和 C++ 接口(interface)。它以我希望从 C 和 C++ 函数访问的单一数据类型为中心,因为我想鼓励第三方通过使用任何一种语言编写函数来扩展库。

我了解 C/C++ 混合的基础知识(例如比较 http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html )并提出了以下解决方案:

我的基本设计围绕在 C 中创建一个结构并公开所有数据(这是我的 C 程序员所期望的)并从中派生一个隐藏成员访问的类,希望能使 C++ 程序员更安全地访问该结构。问题来自推导:我想在 C++ 中使用 namespace 并隐藏 C 接口(interface)。当然,不能隐藏 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

最佳答案

实际上,另一种方法是用 C++ 编写完整代码,并仅在此之上编写一个 C slim 接口(interface),使用数据隐藏技术。

namespace Foo {
class Bar {
public:
int property1() const;
std::string const& property2() const;
};
}

在 C 兼容的头文件中:

#ifdef __cplusplus__
extern "C" {
#endif

typedef void* Bar;

Bar foo_bar_new(int i, char const* s);

void foo_bar_delete(Bar b);

int foo_bar_property1(Bar b);

char const& foo_bar_property2(Bar b);

#ifdef __cplusplus__
}
#endif

随附的实现:

Bar foo_bar_new(int i, char const* s) {
return new Foo::Bar(i, s);
}

void foo_bar_delete(Bar b) {
delete static_cast<Foo::Bar*>(b);
}

int foo_bar_property1(Bar b) {
return static_cast<Foo::Bar*>(b)->property1();
}

char const* foo_bar_property2(Bar b) {
return static_cast<Foo::Bar*>(b)->property2().c_str();
}

两个主要优点是:

  • 成熟的 C++ 代码,具有完全封装的数据和更强大的类型系统的所有优点
  • 在 C 接口(interface)中更容易实现跨版本的二进制稳定性

注意:例如,这就是 Clang 和 LLVM 处理 C 兼容性的方式。

关于c++ - 如何在 C 和 C++ 中设计具有并行接口(interface)的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13219026/

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