extern “C”的作用

 C   compiler和C++   compiler将.c/.cpp编译成.obj时候给一个方法命名时候所采  
   
  用的方案是不同的,C   compiler比较简单,加一个下滑线"_",比如  
   
  foo()   =>   _foo。  
   
  而C++由于有了function   overload以及namespace等机制,稍微复杂了一些。比如  
   
  foo()   =可能=>   _@@@foo@_$$  
   
  当混合使用C和C++进行变成的时候,会出现一些问题,比如我现在有一个  
   
  a.obj,它是用C写的,里面有一个foo(),因此a.obj中它是_foo。  
   
  而现在我把这个.obj用于我的一个C++工程:  
   
  //b.cpp  

 

  void   foo()  
   
  int   main()   {  
  foo();  
  return   0;  
  }  
   
  当我用C++   compiler编译b.cpp的时候,foo这个方法会变成_@@@foo@_$$  
   
  然后存入obj中,接着我link   a.obj和b.obj,linker会从两个obj中  
   
  查找关于_@@@foo@_$$的定义,并且将他们连结起来,但是它找不到_@@@foo@_$$  
   
  的定义了,因为只有_foo的定义在a.obj中。  
   
  因此,要解决这个问题,必须要保持两个obj文件中foo的一致性,extern   "C"就是  
   
  解法,上面的程序改为:  
   
  extern   "C"   void   foo()  
   
  int   main()   {  
  foo();  
  return   0;  
  }  
   
  则,C++编译器就会采用C的命名方式,_@@@foo@_$$不会出现在b.obj中,而变成_foo。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值