gpt4 book ai didi

c++ - 哪个更好 - 从 C 程序调用 C++ 库?

转载 作者:搜寻专家 更新时间:2023-10-31 01:41:57 25 4
gpt4 key购买 nike

我有 C++ 库 .so。我的同事正在开发 c 程序,该程序将从他的 c 程序调用 c++ 库。我告诉他创建 Wrapper.h 和 Wrapper.cpp 并使用指针在他的 c 程序中传递 c++ 对象。但是,我发现他试图通过直接将 Wrapper.cpp 和头文件添加到我们的库 .so 中来修改我们的 c++ 库源代码。例如:

class A{ SetValueA(int); }
class B{ SetValueB(int); }

在他的 Wrapper.cpp 中,他这样写:

A a;
B b;
extern "C" SetValueA(int) {a.SetValueA(int); }
extern "C" SetValueB(int) {b.SetValueB(int); }

然后他重新编译了我们的 c++ 库,并在他的 c 程序中包含了 Wrapper.h。

我告诉他的是这样做:在我的 Wrapper.cpp 中

extern "C" {
A* newClassA() {
return new A();
}

void SetValueA(A* v, int i) {
v->SetA(i);
}
B* newClassB() {
return new B();
}

void SetValueB(B* v, int i) {
v->SetB(i);
}

void deleteClassA(A* v) {
delete v;
}
void deleteClassB(B* v) {
delete v;
} }

然后我编译了我的 Wrapper.cpp 并链接到我们的 c++ 库。在他的c 程序中,他只需要包含Wrapper.h 并编译他的c 代码,然后使用c++ 编译器编译Wrapper.o 和main.o(来自main.c)。

他的解决方案看起来也很有效,他提示说我告诉他的方法更有效。但我不希望他更改我们的 c++ 库,因为没有其他人会使用 c++ 库中的 Wrapper 类。你能告诉我哪个更好吗?为什么?

是的,我也不喜欢他在包装器中使用全局变量的方式。

最佳答案

我不明白为什么需要更改任何库文件以使用全局变量:必要的更改应仅限于 Wrapper.cpp,它显然是包装器的一部分。

也就是说,我不相信使用任何 [可变] 全局对象。它们往往以许多不同的方式成为问题。也就是说,我同意创建包装器的正确方法是有效处理必要的生命周期管理。我确实意识到在 C 中正确排序生命周期管理比在 C++ 中更难。解决方法是使用 C++,而不是创建不必要的依赖项(我知道这个论点通常不适用于 C 程序员)。

关于c++ - 哪个更好 - 从 C 程序调用 C++ 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27650342/

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