我们在平原C
(C99)开发了一些项目.但是,我们在C++
中有一个库作为源代码(数学库).我们需要这个库,所以我想问一下,集成这些源代码最优雅的方式是什么?
C
和C++
的大小之比是20:1
,所以移动到C++
不是选项.我们应该使用静态库吗?DLL?(都在Windows上).
我们在平原C
(C99)开发了一些项目.但是,我们在C++
中有一个库作为源代码(数学库).我们需要这个库,所以我想问一下,集成这些源代码最优雅的方式是什么?
C
和C++
的大小之比是20:1
,所以移动到C++
不是选项.我们应该使用静态库吗?DLL?(都在Windows上).
EDIT:基于 comments 中的讨论,我应该指出,将事物分为C兼容的struct duck
和派生的class Duck
可能是不必要的.您可能可以安全地将实现划分为struct duck
个,消除class Duck
个,从而避免real(…)
个.但是我不太清楚C++(特别是它与C宇宙的交互方式)来提供一个明确的答案.
没有理由不能简单地把所有的C和C++代码链接成一个二进制.
与C++代码的接口需要在C++ API中封装C++ API.在编译C++代码时,可以在extern "C" { ... }
内声明一堆函数,而在编译C客户端代码时没有外部声明.例如.:
#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++源中定义Debug struct ,甚至可以从它继承真正的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); }