前段时间遇到了一个C调用C++的接口的问题,现在把思路整理一下。
提供给我们的是C++头文件(.h)和静态库(.a)
C不可以直接调用C++,我们采用C++调用C++的方法,另外建一个适配层
在我们的C++适配层中加上extern "C"
C调用C++适配层,适配层调用C++就OK了。
下面用一个例子来说明一下:
1、模拟条件one.h,libone.a
one.h
#ifndef __ONE_H__
#define __ONE_H__
void print();
#endif
/
one.cpp
#include<stdio.h>
#include "one.h"
void print(void)
{
printf("Hello world!/n");
}
生成one.a
g++ -c one.cpp
ar -rcs libone.a one.o
one.cpp -----> libone.a
2、要调用C++的C函数
three.c
#include "one.h"
int main()
{
print();
return 0;
}
这样调用肯定是不成功的,和我之前遇到的问题是一样的了
请看下面的解决方法:
3、C++适配层
two.h
#ifndef __TWO_H__
#define __TWO_H__
#ifdef __cplusplus
extern "C"
{
#endif
void print2();
#ifdef __cplusplus
}
#endif
#endif
/
two.cpp
#include "one.h"
#include "two.h"
extern "C"
{
void print2()
{
print();
}
}
编译成库
g++ -c two.cpp
ar -rcs libtwo.a two.o
two.cpp -----> libtwo.a
4、现在直接在three.c中调用two中的print2()就可以达到目的了。
5、需要特别说明的是,这个只是最简单的C++的一个函数,如果这个函数是在类中该怎么办呢?
我们还是本着上面的思想,把C不能识别代码转化为C可以调用的:
假设Classname类中有个成员函数
function_in_class(char str);
这回我们的适配层就要多点东西了
头文件中:typedef void *VClassname ;
源文件中:
static VClassname Classname_create_1()
{
return reinterpret_cast<VClassname> (new Classname());
}
static void function_in_class_c_1(VClassname thiz,char strt)
{
Classname *ins=(Classname *)(thiz);
ins->function_in_class(str);
}
extern "C"
{
VClassname Classname_create()
{
return static_cast<VClassname>(Classname_create_1());
}
void function_in_class_c(VClassname thiz,char str)
{
function_in_class_c_1(thiz,str);
}
}