在C代码中使用C ++库

时间:2008-10-13 23:30:21

标签: c++ c gcc glibc

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

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

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

为什么技术不可能?

我需要注意哪些陷阱

是否有关于此的资源,示例代码和/或文档?


我发现的其他一些事情:

  1. 使用以下命令包装C代码需要使用的C ++标头。
  2. #ifdef __cplusplus
    extern "C" {  
    #endif  
    //  
    // Code goes here ...  
    //  
    #ifdef __cplusplus  
    } // extern "C"  
    #endif
    
    1. 将“真正的”C ++接口保存在C未包含的单独头文件中。在此处考虑PIMPL principle。使用#ifndef __cplusplus #error内容有助于检测任何疯狂。
    2. 小心C ++标识符作为C代码中的名称
    3. 在C和C ++编译器之间大小不一的枚举。如果您使用的是GNU工具链,可能不是问题,但仍然要小心。
    4. 对于结构体,请遵循以下形式,以便C不会混淆。

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

    6. 所有这一切都是出于朋友的礼貌,他是C ++的巫师。

4 个答案:

答案 0 :(得分:66)

是的,这肯定是可能的。您需要在C ++中编写一个接口层,用extern "C"声明函数:

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

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

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

答案 1 :(得分:21)

C ++ FAQ Lite:"How to mix C and C++ code"

这些问题的答案中描述了一些问题:

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

答案 2 :(得分:11)

主要问题:无法在C中捕获异常。如果C ++代码中存在异常上升的可能性,请非常仔细地编写C代码或C ++包装器。相反,C代码中的异常机制(即longjump)(如各种脚本语言中所见)不需要为堆栈上的C ++对象调用析构函数。

答案 3 :(得分:3)

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

extern "C"

如果你的main是C,那么你可能没有静态变量。具有静态变量的任何构造函数都应该在main()start之前调用。如果C是你的主要,这不会发生。我有很多静态变量,最好的办法是用单例替换静态变量。