我有一个C++库,它提供了管理数据的各种类.我有这个库的源代码.

我想扩展C++API以支持C函数调用,以便该库可以同时与C代码和C++代码一起使用.

我使用的是GNU工具链(gcc、glibc等),所以语言和架构支持不是问题.

有什么理由不可能做到这一点吗?

有没有gotcha's个我需要注意的?

是否有与此相关的资源、示例代码和/或文档?


我还发现了其他一些事情:

  1. 使用下面的代码来包装C++代码需要使用的C++头文件.

#ifdef __cplusplus
extern "C" {  
#endif  
//  
// Code goes here ...  
//  
#ifdef __cplusplus  
} // extern "C"  
#endif
  1. 在C文件中不包含C文件中的"真实"C++接口.这里想PIMPL principle.在这里使用#ifndef __cplusplus #error有助于发现任何疯狂.
  2. 注意在C代码中使用C++标识符作为名称
  3. C和C++编译器之间大小不同的枚举.如果您使用的是GNU工具链,可能不是问题,但是还是要小心.
  4. 对于 struct ,请遵循以下形式,以免C混淆.

    typedef struct X { ... } X
    
  5. 然后使用指针来传递C++对象,它们只需在C中声明为 struct 体X,其中X是C++对象.

所有这些都是一个朋友在C++中的向导.

推荐答案

是的,这当然是可能的.您将需要用C++编写一个接口层,该接口层用extern "C":

extern "C" int foo(char *bar)
{
    return realFoo(std::string(bar));
}

然后,您将从C模块调用foo(),该模块将把调用传递给用C++实现的realFoo()函数.

如果需要用数据成员和方法公开一个完整的C++类,那么您可能需要做比这个简单函数示例更多的工作.

C++相关问答推荐

如何用C(使用两个s补数算术的32位程序)计算

在#include中使用C宏变量

GCC预处理宏和#杂注GCC展开

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

为什么数组的最后一个元素丢失了?

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

Caesar密码调试:输出文本末尾的问号和随机字符

int * 指向int的哪个字节?

C++中PUTS函数的返回值

如何逐位读取二进制文件?

将复合文字数组用作临时字符串缓冲区是否合理?

Linux/C:带有子进程的进程在添加waitid后都挂起

C中的空指针是什么(_N)?

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

DennisM.Ritchie的C编程语言一书中关于二进制搜索的代码出现错误?

STM32:代码的执行似乎取决于它在闪存中的位置

令人困惑的返回和 scanf 问题相关

Struct 内的数组赋值

clion.我无法理解 Clion 中发生的 scanf 错误

Clang 是否为内联汇编生成了错误的代码?