在C文件中调用C++代码---笔记

背景:

我们提供的so库中,代码是纯 c++ 代码,里面包含了cpp 的各种特性:类、虚函数等等。但是由于客户平台原因,他们使用的是纯 C 语言,也就是代码文件的后缀也是以 “.c” 结尾的。他们需要在 C 文件中调用我们库里面的 CPP 接口,在编译的时候,编译器一直报找不到接口。

第一次尝试:

通过在我们的 CPP 代码里面加 “extern c” 的方式,错误如故;

第二次尝试:

新创建一个 CPP 文件,在该文件里面以 C 语言的风格,封装调用一次我们 CPP SO 库里面的接口(包括实例化对象等等),然后客户在他们的C文件中,调用进一步封装过后的接口,问题解决。这种解决方法,也就是网络上到处使用的包裹函数方法

分析

浅分析一下:C 语言里面是没有面向对象的特性,而 CPP 里面是有的。CPP 向下兼容 C 语言特性,但是 C 并不兼容 CPP 特性。

第一种情况

如果CPP不涉及到面向对象方面的东西(也就是类等等特性),其实就是一种类 C 语言的风格,这个时候,使用 “extern C” 和 “__cplusplus” 宏就可以完成 C 文件里面的代码可以直接调用 CPP 文件里面的代码

第二种情况

而如果涉及到了类、虚函数等等 CPP 特性的东西,单独靠 “extern C” 和 “__cplusplus” 宏是搞不定的。其原因,需要考虑到 CPP 的类,在编译的时候,编译器是怎么处理的了。而包裹函数,就是一个中间转换过程,其实是把 CPP 的面向对象,弱化到了类 C 语言风格这一个级别,或者说,是编译器进行了一次中间转换,然后 C 文件里面的代码,能够间接找到 CPP 里面类的接口了。(更深入的,就涉及到 CPP 里面相关的基础原理了)

参考资料

参考资料,一个是 stackoverflow 上面的讨论,一个是 csdn 上的一篇博客,里面都有详细的代码操作方法。点击链接可查看:

How to call C++ function from C?

C调用C++库和C++调用C库的方法

关键字

C 调用 C++

你可能感兴趣的:(Linux)