在C中调用C++函数(非成员函数)
如果我们的C++函数有个C连接符(extern “C”),它可以被C编译器编译过的C函数直接调用。被C连接符声明过的C++函数可以拥有C++的一切特征,但是如果我们想在C中调用这个函数,他的参数和返回值必须能被C所支持。例如,一个函数的形参是和IOstream有关的类,那么很遗憾,这就没什么(简单的)办法去让C编译器明白这是什么玩意,也就不能被编译通过了。C不支持C++中的类、模板和references这些特征。
这是一个有C连接符声明的C++函数:
我们可以在C和C++共享的头文件中声明如下的一个print函数
对于重载的函数,我们最多只能用extern “C”声明其中的一个,因为同一个名字只能当作一个C函数,我们可以像下面的例子这样在C++中做一下包装来解决这个问题:
然后C中的包装函数是这样的:
我们也必须在用模板的时候对模板函数做一下包装,因为模板函数不能被extern “C”声明,例子如下:
小结一下,C++的代码该调用重载就调用重载,该调用模板调用模板,没影响,但是C的代码想调用这两种函数的话,必须包装一下。
在C代码中访问C++的类和类的成员函数
Q:我们可以在C代码中访问C++的类吗?
A:或许我们可以在C中声明一个和C++很像的结构体,然后通过某种方式去调用里面的函数?
没错,这种方法是可行的,虽然这样做会给代码的可移植性、和维护上增加一些额外复杂的工作。比如我们C++代码中做了任何的改变,你必须检查一下我们的C代码,有可能也要改变。看下面的例子。
比如现在有一个C++的类:
我们不能在我们的C代码中也添加一个M类,但是可以获得一个指向M类对象的指针,这很像我们在C中用标准输入输出操作文件对象。我们在C++代码中可以像上面包装模板一样再包装一下类的成员函数,如下:
C中使用M类的如下: