gpt4 book ai didi

c++ - 从 C 优雅地调用 C++

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

我们用纯 C (C99) 开发了一些项目。但是,我们在 C++ 中有一个库作为源代码(数学库)。我们需要这个库,所以我想问一下,集成这个源代码的最优雅的方法是什么?

CC++ 的大小之比是 20:1,所以转向 C++ 不是一个选择.我们应该使用静态库吗?动态链接库? (这一切都在 Windows 上)。

最佳答案

编辑:根据评论中的讨论,我应该指出,将事物分离为 C 兼容的 struct duck 和派生的 class Duck 可能是不必要的。您可能可以安全地将实现铲到 struct duck 中并消除 class Duck,从而避免 real(...)。但我对 C++ 的了解还不够深(尤其是它与 C 世界交互的方式),无法就此提供明确的答案。


没有理由不能简单地将所有 C 和 C++ 代码链接到一个二进制文件中。

与 C++ 代码的接口(interface)要求您将 C++ API 包装在 C API 中。您可以通过在编译 C++ 代码时在 extern "C"{ ... } 中声明一堆函数来实现这一点,而在编译 C 客户端代码时不使用 extern 声明。例如:

#ifdef __cplusplus
extern "C" {
#endif

typedef struct duck duck;

duck* new_duck(int feet);
void delete_duck(duck* d);
void duck_quack(duck* d, float volume);

#ifdef __cplusplus
}
#endif

您可以在 C++ 源代码中定义 duck 结构,甚至可以从中继承真正的 Duck 类:

struct duck { };

class Duck : public duck {
public:
Duck(int feet);
~Duck();

void quack(float volume);
};

inline Duck* real(duck* d) { return static_cast<Duck*>(d); }

duck* new_duck(int feet) { return new Duck(feet); }
void delete_duck(duck* d) { delete real(d); }
void duck_quack(duck* d, float volume) { real(d)->quack(volume); }

关于c++ - 从 C 优雅地调用 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42765002/

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