博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

c++知识点--extern "C"的作用

Posted on 2009-06-23 09:52  sashow  阅读(375)  评论(0编辑  收藏  举报

在 c++ 或者 c 的源代码中,经常看到 extern "C"这样的写法,主要原因是各个编译器的名字改编方式不同,下面是来自:
http://blog.csdn.net/vinep/archive/2009/02/17/3899780.aspx 一篇原文,粘贴一下,已备查看。
 

以int func(int, int)为例,C的编译器会将名字改编为_func, 而C++的编译器会改编为_func_int_int 或_funcii(各编译器不同)。如果这个函数在C中编译成库,目标文件中函数名为_func,当这个函数中C++中被调用时,C++的编译器就会到目标文件中寻找_funcii,结果找不到,出错。所以为了防止这种问题,在C++调用时,将函数声明前加个extern "C" 告诉C++的编译器,不要对名字再进修饰,而直接去找_func。因为C、C++的编译器对函数名的修饰不同,为了保证在C、C++中编写的函数能够被互相调用,所以采用这个

链接指示符

同样在C++中编译的函数,如果想让C来使用,通常也加上extern "C"在编译时将函数名按C的风格进行修饰。通常C中编写的函数如果有在其它语言中使用的可能,通常会有下面形式的声明:#ifdef  __cplusplusextern "C" {#endif/**** some declaration or so *****/#ifdef  __cplusplus    }#endif  /* end of __cplusplus */即在声明时已经加上extern "C" 而不需要调用时麻烦。例如在VC++中调用C的库函数就不用作特别的声明。extern "C"的使用要点

 


 

 

 

 

 

 

 


1. 可以是单一语句
    extern "C" double sqrt(double);
2. 可以是复合语句, 相当于复合语句中的声明都加了extern "C"
    extern "C"
   {
      double sqrt(double);
      int min(int, int);
  }
3.可以包含头文件,相当于头文件中的声明都加了extern "C"
   extern "C"
  {
    #i nclude <cmath>
  }
4. 不可以将extern "C" 添加在函数内部
5. 如果函数有多个声明,可以都加extern "C", 也可以只出现在第一次声明中,后面的声明会接受第一个链接指示符的规则。
6. 除extern "C", 还有extern "FORTRAN" 等。