C代码调用C++代码方法示例

这篇文章主要介绍了C语言代码中调用C++代码的方法示例,文中也介绍了C++代码调用C代码的方法,有需要的朋友可以参考借鉴,下面来一起看看吧。

C++代码调用C代码

只要分别在包含的C头文件的开头和结尾加上如下的两个块:

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

C代码调用C++代码

那到底有没有办法在C代码中调用C++代码呢?方法当然是有的,而且还不止一种。

通过extern “C”调用

在 .cpp 文件中定义一个函数,声明为extern "C",则该函数可以方便地在C代码中调用。由于该函数在 .cpp 文件中定义,因而在该函数的实现中,可以调用任意的C++代码,包括C++函数,创建C++类等等。

#ifndef CPPFUNCTIONS_H_
#define CPPFUNCTIONS_H_
#ifdef __cplusplus
int cpp_func(int input);
extern "C" {
#endif
int c_func(int input);
#ifdef __cplusplus
}
#endif
#endif /* CPPFUNCTIONS_H_ */

C++实现文件如下:

#include "CppFunctions.h"
int cpp_func(int input) {
 return 5;
}
int c_func(int input) {
 return cpp_func(input);
}

在C代码里调用C++函数:

#include 
#include "CppFunctions.h"
int main(int argc, char **argv) {
 printf("%d\n", c_func(10));
 return 0;
}

在C++文件里定义的c_func函数就像一座桥一样,连接了C代码的世界和C++代码的世界。但 C 函数c_func的参数及返回值的类型自然是受到一定的限制的,但在函数实现中可以适配要调用的C++接口,做一些适配。

方法二

通过dlopen/dlsym调用

借助于在 .cpp 文件中定义的C函数,间接地调用C++接口,固然是能实现在 C 代码中调用C++代码的目标,然而还是有些麻烦。通过libdl提供的接口,可以使我们的目标通过更简便的方式实现。为dlsym传入经过修饰的符号,可以找到对应的函数的地址。

通过如下命令将上面的CPPFunctions.cpp文件编译为一个动态链接库:

$ gcc -shared -fPIC CPPFunctions.cpp -o libCppLibTest.so

通过dlopen和dlsym找到对应的C++函数,并将其强制类型转换为适当类型的函数指针,然后通过函数指针调用目标函数,如:

#include 
#include 
int main(int argc, char **argv) {
 void *libCPPTest = dlopen("/home/hanpfei0306/workspace_java/CppLibTest/Debug/libCppLibTest.so", RTLD_NOW);
 int (*cpp_func)(int) = (int (*)(int))dlsym(libCPPTest, "_Z8cpp_funci");
 printf("cpp_func = %p\n", cpp_func);
 printf("cpp_func output = %d\n", cpp_func(10));
 return 0;
}

 

你可能感兴趣的:(C++)