c++ - 指向 C++ 类的不透明 C 指针的正确 typedef 是什么?
问题描述
有几十个 SO 问题和博客文章描述了用 C API 包装 C++ 类。示例包装 C++ 类 API 以供 C 使用
大多数这些答案和博客文章都是这样的:
typedef void* CMyClass;
但是其他人说这很糟糕,因为它没有提供类型安全。他们提出了不透明结构的各种变体,没有任何解释。我可以复制上面的片段并继续我的生活(同时我会这样做),但我想一劳永逸地知道
- 哪种形式最好?
- 它提供了哪些保证
void*
? - 它是如何工作的?
解决方案
struct MyType
在 C++ 中使用。
用作typedef struct MyType* pMyType;
您的常用手柄。
您的“C”API 应该在 C 和 C++ 中编译(使用extern "C"
C++ 中的包装器来获得正确的链接)。而且您将接近最大类型安全性。
现在,struct MyHandle{void* private_ptr;};
是另一种选择:这避免了将 C++ 类型的名称暴露给 C。只要您将与private_ptr
少数函数的直接交互隔离开来,它在其他任何地方都是类型安全的。
推荐阅读
- c - 在 C 中将结构写入文本文件
- postgresql - 企业数据库 13.1 上的离线 slony 安装
- reactjs - 如何使用 react 和 redux 提交表单?
- javascript - 如何使用框架内的后退按钮链接到另一个页面
- reactjs - 如何将 Styled Components Theme 作为 Props 传递给 Material UI 组件?
- printing - GhostScript:打印时缺少数字签名
- ruby-on-rails - 如何通过多个其他表检索关联记录?
- javascript - javascript 管理异步函数的共享资源访问
- algorithm - 优先处理不同类型的消息
- azure - 如何使用烧瓶舞 make_azure_blueprint 获得多个 API 范围