首页 > 解决方案 > 指向 C++ 类的不透明 C 指针的正确 typedef 是什么?

问题描述

有几十个 SO 问题和博客文章描述了用 C API 包装 C++ 类。示例包装 C++ 类 API 以供 C 使用

大多数这些答案和博客文章都是这样的:

typedef void* CMyClass;

但是其他人说这很糟糕,因为它没有提供类型安全。他们提出了不透明结构的各种变体,没有任何解释。我可以复制上面的片段并继续我的生活(同时我会这样做),但我想一劳永逸地知道

标签: c++ctypedef

解决方案


struct MyType在 C++ 中使用。

用作typedef struct MyType* pMyType;您的常用手柄。

您的“C”API 应该在 C 和 C++ 中编译(使用extern "C"C++ 中的包装器来获得正确的链接)。而且您将接近最大类型安全性。

现在,struct MyHandle{void* private_ptr;};是另一种选择:这避免了将 C++ 类型的名称暴露给 C。只要您将与private_ptr少数函数的直接交互隔离开来,它在其他任何地方都是类型安全的。


推荐阅读