热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

对于C++类的不透明C指针,正确的typedef是什么?

如何解决《对于C++类的不透明C指针,正确的typedef是什么?》经验,为你挑选了2个好方法。

有几十个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 *'


推荐阅读
author-avatar
拍友2602882883
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有