C与C++互相调用的方法
来源:互联网 发布:天刀官网丐妹捏脸数据 编辑:程序博客网 时间:2024/05/17 02:18
C与C++互调用的方法,这篇文章解释的比较清楚了。对于__cplusplus 和extern "C“ 的意义也有说明,__cplusplus这个宏定义只有使用
G++编译时才会生效,所以与extern "C”配合使用,就可以兼容C调C++或C++调用C。使用extern "C“后的效果,可以用objdump工具反汇
编查看就一清二楚了。
平时我们在linux c平台开发的时候,引用了一些Cpp或者C的代码库,发现一些头文件有如下代码条件编译。
#ifdef __cplusplusextern "C" {#endif// 代码#ifdef __cplusplus}#endif
这个是什么意思呢?一开始看到这个也很茫然。上网查找了一些资料。
主要作用:
为了在C++代码中调用用C写成的库文件,就需要用extern"C"来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。
原因:
C++支持函数重载,而C是不支持函数重载的,两者语言的编译规则不一样。编译器对函数名的处理方法也不一样。
假设有这个一个函数原型:
void func(int a,int b){ //code }
可能在C++编译之后会产生_func_int_int之类的名字,因为C++支持重载。而C编译之后,可能为_func。
关键字:extern "C" 表示编译生成的内部符号名使用C约定。
//C++引用C函数的例子//test.c#include <stdio.h>void mytest(){printf("mytest in .c file ok\n");}//main.cppextern "C"{void mytest();}int main(){mytest();return 0;}
//在C中引用C++函数//在C中引用C++语言中的函数和变量时,C++的函数或变量要声明在extern "C"{}里,但是在C语言中不能使用extern "C",否则编译出错。//test.cpp#include <stdio.h>extern "C"{void mytest(){printf("mytest in .cpp file ok\n");}}//main.cvoid mytest();int main(){mytest();return 0;}
//综合使用//一般我们都将函数声明放在头文件,当我们的函数有可能被C或C++使用时,我们无法确定是否要将函数声明在extern "C"里,所以,我们应该添加#ifdef __cplusplusextern "C"{#endif//函数声明#ifdef __cplusplus}#endif
如果我们注意到,很多头文件都有这样的用法,比如string.h,等等。
//test.h#ifdef __cplusplus#include <iostream>using namespace std;extern "C"{#endifvoid mytest();#ifdef __cplusplus}#endif
这样,可以将mytest()的实现放在.c或者.cpp文件中,可以在.c或者.cpp文件中include "test.h"后使用头文件里面的函数,而不会出现编译错误。
//test.c#include "test.h"void mytest(){#ifdef __cpluspluscout << "cout mytest extern ok " << endl;#elseprintf("printf mytest extern ok n");#endif}//main.cpp#include "test.h"int main(){mytest();return 0;}转载于:https://www.cnblogs.com/nx520zj/p/5920782.html
阅读全文
0 0
- C与C++互相调用的方法
- TCL与c/c++的互相调用
- TCL与c/c++的互相调用
- lua与C的互相调用
- Lua 脚本语言 与 C的互相调用
- JavaScript与Objective-C的互相调用
- JNI JAVA与C的互相调用
- C与C++互相调用
- c与c++互相调用
- c++与c互相调用
- javascript与asp.net(c#)互相调用方法
- C和C++函数互相调用的方法
- C/C++与Java之间的互相调用
- C++与C中的函数互相调用的处理
- C++与C中的函数互相调用的处理
- Android Ndk中C与JAVA之间的互相调用
- python 与 c/c++之间的互相调用
- c和lua之间互相调用方法
- python中all()和any()的区别
- React render props
- PHP CURL获取cookies模拟登录…
- nginx部署项目
- 文件上传类demo
- C与C++互相调用的方法
- 如何处理大量数据高并发大流量并发操作方案
- 小程序获取网络状态
- nginx下ueditor上传图片时目录创建…
- 一份关于CURL模拟采集的贴(虽然很…
- Android使用volly请求utf-8报错Value  of type java.lang.String cannot be converted to
- Kettle (1)
- 防止点击事件里面的代码重复运行
- Object类的方法