extern "c"的作用详解

extern "c"的主要作用就是为了能够正确实现C++代码调用其它C语言代码。加上extern "c"后,会指示编译器这部分代码按照C语言的风格进行编译。
         由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;C语言并不支持函数重载,因此编译C代码的函数时不会带上函数的参数类型,一般只包括函数名。

这个功能十分有用,因为在C++出现以前,很多代码都是C语言写的,而且底层的库也是C语言写的,为了更好的支持原来的C代码和已经写好的C语言库,需要在C++中尽可能的支持C,而extern "c"就是其中的一个策略。

这个功能主要用在下面的情况:
   1、C++代码调用C语言代码
   2、在C++的头文件中使用
   3、在多个人协同开发时,可能会出现有人编写C代码,有人能编写C++代码,这样的情况也可以使用extern "c"。

extern "c"包含双重语义,从字面上可以知道,首先,被他修饰的目标是"extern"的;其次,被他修饰的目标代码是"C"的。被extern "c"限定的函数和变量
是extern的。
     看这个例子: extern int a;   仅仅是一个变量的声明,并不是在定义变量a,也没有为a分配空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出错。

extern "c"使用要点:
   1、可以使单一语句。
      extern "c" double sqrt(double)
   2、可以使复合语句,相当于复合语句中的声明都加了extern "c"。
      extern "c"
      {
          double sqrt(double);l
          int min(int,int);
      }
    3、可以包含头文件,相当于头文件中的声明都加了extern "c"。
       extern "c"
       {
           #include<cmath>
       }
    4、不可以将extern "c"添加到函数内部。
    5、如果函数有多个声明,可以都加extern "c",也可以只出现在第一次声明中,后面的声明会接受第一个链接指示符的规则。

时间: 2024-10-08 13:36:53

extern "c"的作用详解的相关文章

extern “C”的作用详解

extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码.加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的.由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名:而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名. 这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了

java中static作用详解

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类

Linux(centos)系统各个目录的作用详解

Linux(centos)系统各个目录的作用详解 文件系统的类型 LINUX有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等,可用cat.less.more.vi.emacs来察看内容,用mv来改名. 目录文件:包括文件名.子目录名及其指针.它是LINUX储存文件名的唯一地方,可用ls列出目录文件. 连接文件:是指向同一索引节点的那些目录条目.用ls来查看是,连接文件的标志用l开头,

C#面向对象特征的具体实现及作用详解

C#面向对象特征的具体实现及作用详解 作者: 字体:[增加 减小] 类型:转载 所有的面相对象思想,归根结底是为了简化代码,减少代码量,构建更符合现实生活逻辑的程序代码,从而减轻程序员的负担.不能一味地或者说刻意地去使用面相对象的思想而忽略了程序所实现的功能或者框架,要根据实际情况 众所周知,面向对象编程的特点为:封装.继承.多态.C#是一门完全面向对象的语言,由于比Java推出的时间还要晚,所以对面向对象的思想的体现比Java还要完美,那么在C#中如何体现封装.继承和多态呢?下面举例并进行说明

shell脚本中常见的一些特殊符号和作用详解

这篇文章主要介绍了shell脚本中常见的一些特殊符号和它的作用详解,总结的很简洁,容易看懂,需要的朋友可以参考下 在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1.{} 大括号: 用法一:通配符扩展eg: ls my_{finger,toe}s这条命令相当于如下命令的组合:ls my_fingers my_toeseg: mkdir {userA,userB,userC}-{home,bin,data}我们将得到

C++中头文件与源文件的作用详解

一.C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件.其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码:而 .h 文件则被称作 C++ 头文件,里面放的也是 C++ 的源代码. C++ 语言支持"分别编译"(separatecompilation).也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的 .cpp 文件里..cpp 文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通

java虚拟机内存区域的划分以及作用详解

序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什么叫运行时数据区呢,看下图就知道了,今天的重点就围绕这张图讲. 1.程序计数器(寄存器) 当前线程所执行的字节码行号指示器 字节码解释器工作依赖计数器控制完成 通过执行线程行号记录,让线程轮流切换各条线程之间计数器互不影响 线程私有,生命周期与线程相同,随JVM启动而生,JVM关闭而死 线程执行Ja

ContextLoaderListener作用详解(转)

ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息.因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法.至于ApplicationContext.xml这个配置文件部署在哪,如何配置多个xml文件,书上都没怎么详细说明.现在的方法就是查看它的API文档.在ContextLoaderListener中关联了ContextLoader这个

ContextLoaderListener作用详解

参考网址:http://blog.csdn.net/ysughw/article/details/8992322 ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息.因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法.至于ApplicationContext.xml这个配置文件部署在哪,如何配置多个xml文件,现在的方法就是查看它的A