是否可以在c程序中使用c ++库函数?

时间:2011-03-30 06:16:19

标签: c++ c

在c程序中,我想运行c ++库函数,但我不知道怎么能这样做。像c ++程序员一样,我知道如何在c ++ prog下使用c程序。因此,我想知道有可能在c?中使用c ++库函数,即cout,vector等。

3 个答案:

答案 0 :(得分:5)

通常,您不能在C中使用C ++工具。

但是,C ++库可以通过声明它们extern "C"来选择将其某些功能导出到C程序。如果您的C ++库不这样做,您将不得不编写一些包装器(在C ++中)来执行此操作。

请注意,此类导出功能必须符合C的限制。例如,您不能使用非POD类型,函数重载,运算符重载,转换运算符,RTTI,异常,模板等。

答案 1 :(得分:1)

正如Chris Jester-Young所说,你不能直接使用它们。但是你可以用C ++编写包装器,将函数导出为普通的c函数。

基本上你编写了一个Create-Method(例如CreateVector),它返回一个句柄(例如this指针作为int),一个Destroy-Method(例如DestroyVector),它接受句柄并删除对象。然后你必须包装对象的每个成员方法。包装器方法具有相同的签名,除了它需要一个额外的参数 - 句柄。

这是 - 取决于要包装的方法的数量 - 大量的重复性工作。但这很容易上班。有关“使用句柄在C中进行面向对象编程”的示例,请查看Windows-API。

答案 2 :(得分:0)

您必须围绕要使用的C ++函数创建extern "C"包装函数。此步骤要求您手动选择所需功能的名称。

//Header file:

#ifdef __cplusplus
extern "C" {
#endif

int *find_int( int *first, int *last, int value );

#ifdef __cplusplus
}
#endif

//C++ source file:

int *find_int( int *first, int *last, int value ) {
    return std::find( first, last, value );
}

将其编译成一个库(静态或动态),或者只是将其与项目中的C源代码放在一起,具体取决于构建环境的工作原理。