将正向声明的C结构定义为C++结构
Define forward declared C-struct as C++-struct
将struct
转发声明为C-struct
合法吗
// api.h
#ifdef __cplusplus
extern "C" {
#endif
typedef struct handle_tag handle_t;
handle_t *construct();
void destruct(handle_t *h);
void func(handle_t *h);
#ifdef __cplusplus
}
#endif
并随后将其定义为C++-struct
,即非POD类型?
// api.cpp
struct handle_tag {
void func();
std::string member;
};
void func(handle_t *h) {
h->func();
}
一般目的是通过C接口获得一个外部可访问的不透明类型handle_t
,该类型在内部实现为C++数据类型。
是的,只要C代码永远不需要看到handle_tag
结构的"内部",并且由C++代码执行适当的C++构建/销毁(我预设construct
和destruct
是用于此结构的),就可以正常工作。
C代码所需要的只是一个指向某些数据结构的指针——它不知道内容是什么,所以内容可以是你想要的任何内容,包括依赖构造函数/析构函数的数据。
编辑:我应该指出,这或类似的方法(例如,使用void *
将C部分的对象地址记录到hold
)是将C代码接口到C++功能的一种相当常见的方式。
第2版:至关重要的是,被调用的C++代码不会将异常"泄漏"到C代码中。这是一种未定义的行为,很容易导致撞车,或者更糟的是,不会撞车的"奇怪的事情"。。。因此,除非保证代码不会引起异常(例如,在内存不足的情况下,std::string
可能会抛出bad_alloc
),否则需要在代码内部使用try/catch
块,如C++侧的construct
和func
。
不能按原样工作,但概念还可以。当函数被定义时,您还需要确保名称没有被破坏,以便C代码可以找到它们。这意味着#include "api.h"
应该添加到api.cpp文件的顶部。
相关文章:
- 我的超类中的模板问题与结构定义
- 为私有结构定义双参数运算符重载
- 可视化C++中的结构定义错误
- 如何在结构定义中组合__attribute__((dllexport))和[[nodiscard]]?
- COM 互操作结构定义与内存布局不匹配
- C 在标题文件中创建具有结构定义的结构的队列
- 如何将结构定义为结构的成员
- 在这个节点定义中,为什么我们在结构定义之后使用"Node"?
- 不同模块中的ambigus结构定义
- 有条件的C/C 结构定义
- C++ 初始化结构定义中的向量
- 字符串声明中的结构定义中的字符串声明
- 使用结构定义函数
- 为具有许多数据成员的结构定义 == 和<
- enableif结构定义和默认模板参数
- C 使用模板为结构定义别名
- C/C++ 中的套接字编程 - 接收由 typedef 结构定义的消息
- 为C++结构定义显式析构函数如何影响调用约定
- 当结构定义在头文件中时,如何在main()中创建结构数组
- C结构定义标准