gpt4 book ai didi

c++ - 如何将 c++ std::shared_ptr 包装在包装器头文件中以便可以从 c 中调用它?

转载 作者:太空宇宙 更新时间:2023-11-04 07:44:44 24 4
gpt4 key购买 nike

我正在编写一个小型 Wrapper API,因此我可以调用一些 C++来自 C 的代码(类/函数) .我遇到了问题,我的一个 C++函数在我的包装器 header 中用 "shared_ptr" 初始化.

ClassName *ClassName _new(std::shared_ptr<Lib::Instance> p_Instance);

正如您所见,包装文件充满了 C++ 风格。这很糟糕,因为包装文件 should be readable by C AND C++ .

这是我的 Wrapper.h 文件:

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

typedef struct ClassName ClassName;

ClassName *ClassName_new(std::shared_ptr<Lib::Instance> p_Instance);

void ClassName_setValue(ClassName* t, double p_value);

void ClassName_delete(ClassName* t);

#ifdef __cplusplus
}
#endif /* __cplusplus */

这是我的 Wrapper.cpp 文件:

#include "Wrapper.h"
#include "ClassName.h"

extern "C"{

ClassName* ClassName_new(std::shared_ptr<Lib::Instance> p_Instance){
return new ClassName(p_Instance);
}

void ClassName_setValue(ClassName* t, double p_value){
t->setValue(p_value);
}

void ClassName_delete(ClassName* t){
delete t;
}
}

这是我的主要 .cpp 文件的一部分 header :

class ClassName: public Lib::Util::Task {
public:
ClassName(std::shared_ptr<Lib::Instance> p_Instance);
virtual ~ClassName();
void setValue(double p_value);
...

.Cpp:

ClassName::ClassName(std::shared_ptr<Lib::Instance> p_Instance) ...
...
void ClassName::setValue(double p_value){
doSomething()
}
...

不允许我在使用 ClassName(std::shared_ptr<Lib::Instance> p_Instance); 的地方更改主 C++ 文件的结构

您有什么办法可以解决这个问题吗?也许写第二个包装器?

编辑:这是终端给出的错误:

Wrapper.h:21:45: error: expected ‘)’ before ‘:’ token
ClassName *ClassName_new(std::shared_ptr<Lib::Instance> p_Instance);
^

最佳答案

该函数不能在 C 中使用,因此您可以像使用 extern "C" 一样使用预处理器删除声明:

// Wrapper.h
#ifdef __cplusplus
ClassName *ClassName_new(std::shared_ptr<Lib::Instance> p_Instance);
#endif

尽管在 C++ 中除了 Wrapper.cpp 之外不应该使用此包装器,因此将声明移至 Wrapper.cpp 可能是更好的选择。


如果您需要一种从 C 调用 ClassName_new 的方法,我建议您不要使用共享指针。但是您可以让它与不透明的包装器一起工作:

// Wrapper.h
struct opaque_wrapper* make_instance(void);
void release_instance(struct opaque_wrapper*);
ClassName *ClassName_new(struct opaque_wrapper*);

// Wrapper.cpp
struct opaque_wrapper {
std::shared_ptr<Lib::Instance> p_Instance;
};
opaque_wrapper* make_instance() {
return new opaque_wrapper{std::make_shared<Lib::Instance>()};
}
void release_instance(struct opaque_wrapper* instance) {
delete instance;
}
ClassName *ClassName_new(struct opaque_wrapper* instance) {
return ClassName_new(instance->p_Instance);
}

关于c++ - 如何将 c++ std::shared_ptr 包装在包装器头文件中以便可以从 c 中调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58080505/

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