探索C++的秘密之详解extern.docVIP

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
探索C的秘密之详解extern

探索C++的秘密之详解extern   时常在cpp的代码之中看到这样的代码: 以下是引用片段:   #ifdef__cplusplus   externC{   #endif   //一段代码   #ifdef__cplusplus   }   #endif   这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern C{和}处理其中的代码。   要明白为何使用extern C,还得从cpp中对函数的重载处理开始说起。在c++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等.而在C中,只是简单的函数名字而已,不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的.   比如下面的一段简单的函数,我们看看加入和不加入extern C产生的汇编代码都有哪些变化: 以下是引用片段:   intf(void)   {   return1;   }   在加入extern C的时候产生的汇编代码是: 以下是引用片段:   .filetest.cxx   .text   .align2   .globl_f   .def_f;.scl2;.type32;.endef   _f:   pushl%ebp   movl%esp,%ebp   movl$1,%eax   popl%ebp   ret   但是不加入了extern C之后 以下是引用片段:   .filetest.cxx   .text   .align2   .globl__Z1fv   .def__Z1fv;.scl2;.type32;.endef   __Z1fv:   pushl%ebp   movl%esp,%ebp   movl$1,%eax   popl%ebp   ret   两段汇编代码同样都是使用gcc -S命令产生的,所有的地方都是一样的,唯独是产生的函数名,一个是_f,一个是__Z1fv。   明白了加入与不加入extern C之后对函数名称产生的影响,我们继续我们的讨论:为什么需要使用extern C呢?C++之父在设计C++之时,考虑到当时已经存在了大量的C代码,为了支持原来的C代码和已经写好C库,需要在C++中尽可能的支持C,而extern C就是其中的一个策略。   试想这样的情况:一个库文件已经用C写好了而且运行得很良好,这个时候我们需要使用这个库文件,但是我们需要使用C++来写这个新的代码。如果这个代码使用的是C++的方式链接这个C库文件的话,那么就会出现链接错误.我们来看一段代码:首先,我们使用C的处理方式来写一个函数,也就是说假设这个函数当时是用C写成的: 以下是引用片段:   //f1.c   externC   {   voidf1()   {   return;   }   }   编译命令是:gcc -c f1.c -o f1.o 产生了一个叫f1.o的库文件。再写一段代码调用这个f1函数: 以下是引用片段:   //test.cxx   //这个extern表示f1函数在别的地方定义,这样可以通过   //编译,但是链接的时候还是需要   //链接上原来的库文件.   externvoidf1();   intmain()   {   f1();   return0;   }   通过gcc -c test.cxx -o test.o 产生一个叫test.o的文件。然后,我们使用gcc test.o f1.o来链接两个文件,可是出错了,错误的提示是: 以下是引用片段:   test.o(.text+0x1f):test.cxx:undefinereferencetof1()   也就是说,在编译test.cxx的时候编译器是使用C++的方式来处理f1()函数的,但是实际上链接的库文件却是用C的方式来处理函数的,所以就会出现链接过不去的错误:因为链接器找不到函数。   因此,为了在C++代码中调用用C写成的库文件,就需要用extern C来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。   比如,现在我们有了一个C库文件,它的头文件是f.h,产生的lib文件是f.lib,那么我们如果要在C++中使用这个库文件,我们需要这样写: 以下是引用片段:   externC   {   #includef.h   }   回到上面的问题,如果要改正链接错误,我们需要这样子改写

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档