现在的位置: 首页 > 综合 > 正文

c++知识点–extern “C”的作用

2012年07月24日 ⁄ 综合 ⁄ 共 867字 ⁄ 字号 评论关闭

因为C、C++的编译器对函数名的修饰不同,为了保证在C、C++中编写的函数能够被互相调用,所以采用这个链接指示符

以int func(int, int)为例,C的编译器会将名字改编为_func, 而C++的编译器会改编为_func_int_int 或_funcii(各编译器不同)。

如果这个函数在C中编译成库,目标文件中函数名为_func,当这个函数中C++中被调用时,C++的编译器就会到目标文件中
寻找_funcii,结果找不到,出错。
所以为了防止这种问题,在C++调用时,将函数声明前加个extern "C" 告诉C++的编译器,不要
对名字再进修饰,而直接去找_func。

同样在C++中编译的函数,如果想让C来使用,通常也加上extern "C"在编译时将函数名按C的风格进行修饰。

通常C中编写的函数如果有在其它语言中使用的可能,通常会有下面形式的声明:
#ifdef  __cplusplus

extern "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" 等。

抱歉!评论已关闭.