extern “C”的作用

来源:互联网 发布:中国与全世界为敌 知乎 编辑:程序博客网 时间:2024/04/29 18:17

 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。

原创粉丝点击