在 C 代码中使用 C + + 库

我有一个 C + + 库,它提供了用于管理数据的各种类。我有图书馆的源代码。

我想扩展 C + + API 以支持 C 函数调用,这样这个库就可以同时与 C 代码和 C + + 代码一起使用。

I'm using GNU tool chain (gcc, glibc, etc), so language and architecture support are not an issue.

是否有任何原因,为什么这是 严格来说不可能?

有什么 抓到你了需要我注意的吗?

Are there resources, example code and/or documentation available regarding this?


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

  1. 使用以下代码包装需要由 C 代码使用的 C + + 头。

#ifdef __cplusplus
extern "C" {
#endif
//
// Code goes here ...
//
#ifdef __cplusplus
} // extern "C"
#endif
  1. 将“真正的”C + + 接口保存在 C 不包含的单独头文件中。在这里考虑 PIMPL 原则。使用 #ifndef __cplusplus #error的东西有助于在这里检测任何疯狂。
  2. 小心 C + + 标识符作为 C 代码中的名称
  3. 枚举的大小在 C 和 C + + 编译器之间变化。如果您正在使用 GNU 工具链,那么可能不是一个问题,但是仍然要小心。
  4. 因为结构遵循以下形式,所以 C 不会混淆。

    typedef struct X { ... } X
    
  5. Then use pointers for passing around C++ objects, they just have to be declared in C as struct X where X is the C++ object.

All of this is courtesy of a friend who's a wizard at C++.

96503 次浏览

是的,这当然是可能的。你需要用 C + + 编写一个接口层,用 extern "C"声明函数:

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

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

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

你可以混合 C/C + + 代码。如果在 C + + 中使用 main ()函数,那么只需要确保声明了 c 函数

extern "C"

如果您的主要是 C,那么除了静态变量之外,您可能没有问题。任何带有静态变量的构造函数都应该在 main ()启动之前调用。这不会发生,如果 C 是你的主要。如果你有很多静态变量,最好的办法就是用单例代替静态变量。

主要问题: 异常不能在 C 语言中捕获。如果在 C + + 代码中出现异常的可能性,那么要么非常小心地编写 C 代码,要么编写 C + + 包装器。相反,C 代码中的异常机制(例如,longhop)(在各种脚本语言中都可以找到)不需要为堆栈上的 C + + 对象调用析构函数。

C++ FAQ Lite: “如何混合 C 和 C + + 代码”.

在回答这些问题时描述了一些陷阱:

  • [32.8]如何将 C + + 类的对象传递给/从 C 函数传递?
  • 我的 C 函数可以直接访问 C + + 类对象中的数据吗?