下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、externc 链接指示符与c 和 c+接口的建立方法很久以前写的了,一直忘了贴上来了 今天看 ORACLE 烦了,有时间贴上来 前言:昨天脑子一热问了一个很 easy 的问题,结果把自己都弄糊涂了,惹来高手们的痴笑,回头想一想是个很简单的问题,却想了那么多,晕!今天做个总结吧! (:- 链接指示符 (linkage directive) extern “C” 的问题: 如果我们在自己的程序中要用到其它语言所编写的函数,那么我们的调用函数就必须告诉编译器使用不同的要求。因为函数在函数名的生成,参数的入栈,栈的清空等等方面与所使用的语言是密切相关的。Linkage director告诉编译器,该
2、函数是用其他的程序设计语言编写的。 Linkage director 有两种形式: 1单一的语句( single statement)形式: extern “ C” void exit(int );2. 复合的语句( compoundstatement)形式:extern“C”int printf(const char*.);int scanf(const char *.);或: extern“ C” #include<cmath>这里 只是一个分割符,用来说明在那个链接指示符用在那些声明上,没有其它的意义了,也就是说在花括号内声明的函数是可见的了!不要胡思乱想!e
3、xtern“XX ”可以告诉编译器, 该函数是用其它语言来编写的, 但强制这些函数采用 XX 语言的方式进行编译。 举个例子说吧! C 接口的方法: C 中调用 C+ 函数:生成一个工程叫demo加入一个demo.c内容如下:intadd(inta,int b );/ 有无都可int main()int i=add(3,2);printf("i=%d",i);return 0;再加入一个add.cpp,(注意扩展名,强制控制台生成两种文件类型)内容如下:intadd(int a,int b)return a+b; 如果这样编译的话,会产生下面的错误:Linking.demo
4、.obj : errorLNK2001: unresolved external symbol _addDebug/demo.exe :fatal error LNK1120: 1 unresolved externalsError executinglink.exe 根据提示说是没有找到-add,可是我明明定义了!.为了搞清这个这个问题,就要搞清楚到底C 的函数和CPP的函数在编译之后, 会变成什么样子!C+ 支持重载,C 中不支持,而C+ 怎么区分这些重载函数呢,究竟调用那下一个呢? C+ 会能过不同的参数来选择不同的具有相同名称的不同的实现函数的调用。C+ 函数被编译以后,函数会附带一些
5、附加的参数信息!我们以实事说话:在add.cpp中再加入一个同名函数实现重载floatadd(floatfa,float fb)return fa+fb;intadd(int a,int b)return a+b; 单独编译此文件没有问题! 输出一个map文件,找到add函数: AddressPublics by ValueRva+BaseLib:Object0001:00000030_main00401030 fdemo.obj0001:00000080?addYAMMMZ00401080 fadd.OBJ0001:000000b0?addYAHHHZ004010b0 fadd.OBJ 明白
6、了吧!精华都在这里了!提示说找不到 _add,原来是在C 语言被编译过程中,自动加上了下画线了!看看main 就知道了!而在C+ 中,函数被扩展了, ?addYAMMMZ ,前面两个 相当于左括号,后面一个相当于右括号,中间的就是用来表示参数的了!简单吧!两个重载函数使用了不同的参数,一个是整数,一个是浮点数,当这两个函数进行连接时,在相应的 C+ 的连接过程中,编译器也会以编译出来的名字到对应的OBJ 文件中查找。 在C+ 编译中,会把参数的类型,名字和函数的名字组合成为一个新的函数,这样就和程序定义的函数名这相一致!在在看看错误提示,我们的输出文件中也找不到这个现_add,所以程序不可能连
7、接上。知道原因就解决吧!最直接的方法就是修改 C+ 文件的编译结果, 让它产生一个对应 C 的函数名字,也就是按 C 的方法来生成对应的函数。 在 C+ 的头文件中加入: extern "C" int add(int a,int b);extern “ C” 语句的作用就是把C+ 函数按 C 约定编译! 运行,OK!AddressPublics by ValueRva+BaseLib:Object0001:00000030_main00401030 fdemo.obj0001:00000080?addYAMMMZ00401080 fadd.obj 0001:000000b0
8、_add004010b0 fadd.obj 变了吧! 那么 C+ 中调用 C 呢!由于两者之间的关系,C+ 中可以说是直接调用就可以了!不过这是有条件的!把 demo.c 改成: intsubstract(int a,intb)return a-b;voidhello()printf("hello");add.cpp改为: void hello();intsubstract(int a,int b); int main()hello();intc=substract(4,1);printf("c=%d",c);return 0; 编译运行,出现了上次一样
9、的错误:加上 extern "C" voidhello(); int substract(int a,int b);就 OK了!这是两者的 map比较: 0001:00000030_substract00401030 fdemo.obj 0001:00000060_hello00401060 fdemo.obj0001:00000030_substract00401030 fdemo.obj 0001:00000060_hello00401060 fdemo.obj发现是一样的!问题在于你在add.cpp 前面加入了: void hello();int substract(int a,int b);这样就把两个函数编译成了C+ 方式,去找它的实现代码的时候,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科技公司年会策划方案
- 深度解析(2026)《GBT 26436-2025禽白血病诊断技术》(2026年)深度解析
- 2025福建南平市邵武市金塘工业园区专职消防队专职消防队员招聘补充14人参考考试题库及答案解析
- 深度解析(2026)《GBT 26001-2010烧结路面砖》(2026年)深度解析
- 2026渭南澄城县征集见习岗位和见习人员招募备考笔试试题及答案解析
- 深度解析(2026)《GBT 25907.6-2010信息技术 维吾尔文、哈萨克文、柯尔克孜文编码字符集 16点阵字型 第6部分:如克黑体》
- 深度解析(2026)《GBT 25865-2010饲料添加剂 硫酸锌》(2026年)深度解析
- 深度解析(2026)《GBT 25746-2010可锻铸铁金相检验》(2026年)深度解析
- 2025广东清远市清城区档案馆招聘后勤服务类人员1人参考考试试题及答案解析
- 2025年昆明市禄劝县人力资源和社会保障局公益性岗位招聘(5人)参考笔试题库附答案解析
- 2026年日历表含农历(2026年12个月日历-每月一张A4可打印)
- 节能基本情况表(打印)
- 创新思维与创业实验-东南大学中国大学mooc课后章节答案期末考试题库2023年
- 电动车转让合同协议书电子版
- 大学生创业计划书word文档(三篇)
- YS/T 1019-2015氯化铷
- GB/T 39081-2020电阻点焊及凸焊接头的十字拉伸试验方法
- GB/T 25390-2010风力发电机组球墨铸铁件
- GA 38-2021银行安全防范要求
- Mill准则-吉林大学课程中心课件
- 猫(猫的形态、习性、繁殖)-课件
评论
0/150
提交评论