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

CC++的大小之比是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); }

C++相关问答推荐

try 使用libusb控制音量时LIBUSB_WRIGHT_PIPE

为什么这个C程序代码会产生以下结果?

使用单个字节内的位字段

如何使fputs功能提示错误输入并要求用户重新输入.程序停止而不是请求新的输入

识别和处理c中整数溢出的最佳方法?

从纯C中访问通用项对话框

为什么net/if.h在ifaddrs.h之前?

在C++中使用函数指针的正确语法

不同出处的指针可以相等吗?

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

S在本文中的价值观到底出了什么问题?

在进程之间重定向输出和输入流的问题

如何在不使用字符串的情况下在c中编写函数atof().h>;

我正在try 将QSORT算法实现为C++中的泛型函数

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

为什么程序在打印每个数字之前要等待所有输入?

C 中类型说明符的顺序重要吗?