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