gpt4 book ai didi

c++ - 将前向声明的 C-struct 定义为 C++-struct

转载 作者:可可西里 更新时间:2023-11-01 17:38:10 36 4
gpt4 key购买 nike

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 接口(interface)获得外部可访问的不透明类型 handle_t,它在内部实现为 C++ 数据类型。

最佳答案

是的,只要 C 代码永远不需要看到 handle_tag 结构的“内部”,并且适当的 C++ 构造/破坏由 C++ 代码执行(我假设constructdestruct 用于)。

C 代码所需要的只是指向某个数据结构的指针 - 它不知道内容是什么,因此内容可以是您喜欢的任何内容,包括依赖于构造函数/析构函数的数据。

编辑:我应该指出,这个或类似的方法(例如使用 void * 来记录 C 部分对象的地址以 hold),是一个相当将 C 代码连接到 C++ 功能的常用方法。

编辑2:调用的 C++ 代码不会将异常“泄漏”到 C 代码中,这一点至关重要。这是未定义的行为,很容易导致崩溃,或者更糟的是,不会崩溃的“奇怪的事情”......所以除非保证代码不会导致异常(例如 std::string 在内存不足的情况下容易抛出 bad_alloc),需要在 construct 等代码中使用 try/catch block C++ 端的 anf func

关于c++ - 将前向声明的 C-struct 定义为 C++-struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17568722/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com