zoukankan      html  css  js  c++  java
  • 【C++】extern "C"的作用

    因为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" 等。

  • 相关阅读:
    java基础第十七篇之网络编程和装饰者模式
    垃圾回收的常见算法
    java基础第十六篇之多线程
    java基础第十五篇之IO流和递归算法
    JVM史上最全实践优化没有之一
    java基础第十三篇之Collection
    java基础第十四篇之Map
    CDN加速静态文件访问
    java基础第十二篇之集合、增强for循环、迭代器和泛型
    Linux--RPM卸载安装
  • 原文地址:https://www.cnblogs.com/dracohan/p/1537012.html
Copyright © 2011-2022 走看看