有几十个SO问题和博客文章描述了用C API包装C++类.示例为C消耗包装C++类API
大多数这些答案和博客文章都是这样的:
typedef void* CMyClass;
Run Code Online (Sandbox Code Playgroud)
但其他人说这很糟糕,因为它没有提供类型安全.他们提出了不透明结构的各种变化,没有任何解释.我可以复制上面的片段并继续我的生活(我会在此期间做),但我想知道一劳永逸
void*?struct MyType在C++中使用.
使用typedef struct MyType* pMyType;如您共同处理.
您的"C"API应该在C和C++中编译(使用extern "C"C++中的包装器来获得正确的链接).而且你将接近最大类型的安全性.
现在,struct MyHandle{void* private_ptr;};是另一种选择:这避免了将C++类型的名称暴露给C.只要你将private_ptr几个函数的直接交互隔离开来,它就会在其他任何地方都是类型安全的.
问题void *在于它无法防止意外分配不兼容的指针.
typedef void *CMyClass;
int i = 1;
CMyClass c = &i; // No complaints
Run Code Online (Sandbox Code Playgroud)
如果您将typedef改为某种独特的opaque类型,编译器将帮助您.
typedef struct MyClass *CMyClass;
int i = 1;
CMyClass c = &i; // BOOM!
Run Code Online (Sandbox Code Playgroud)
我认为在C中这不是错误,但Clang 6.0警告我(即使没有启用任何警告)
warning: incompatible pointer types initializing 'CMyClass' (aka 'struct MyClass *') with an expression of type 'int *'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1476 次 |
| 最近记录: |