`
cppmule
  • 浏览: 448303 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

extern 在c/c++中的作用

    博客分类:
  • C++
 
阅读更多

    extern   "c"     表示函数使用C的连接方式,也就是说能被C语言写的程序调用(C和C++的连接方式是不一样的)。   

  联想   extern   "C++"大概也知道了吧   
    
  在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明?   
  因为   C   语言和   C++   语言的编译规则不一样,所以要告诉系统哪些函数是用   C   方式编译,哪些函数需要用   C++   方式编译。   
  如果你不加   extern   "C"   ,在编译时,系统会提示找不到此函数。   
    
  extern   "C"表示编译生成的内部符号名使用C约定   
  例如:   
  int   Fun(int   i,int   j)   
  C:_Fun   
  C++:_Fun_int_int   
  具体生成什么可能与编译器有关   
  由于C++支持重载,而重载是在编译期确定的,所以C++必须在内部符号名上区分各重载函数,所以就将参数类型加在函数名后。   
    
    
  extern关键字告诉编译器,“这个变量可能定义在这个模块或其它模块中”,一个extern声明并没有生成数据,它仅表明这个数据是共享的。这个变量必须是在别处定义过的,而且它只能定义一次   
  例子如下:   
  extern   "C"   declaration;   
  其中"C"是可选的,包括“C”表明这个条目是根据C语言的约定 来声明的。这个特征使得C语言的模块,不必象C++代码需要进行对名字改写和编译而可以直接访问这些条目。   
    
    
  以下是C++Primer上的一段话   
  如果成员希望呼叫以另一种语言写成的程式,编译器必须控制函式呼叫时的不同需求。例如,c++和其他语言对于汉式命名方式或引数传递次序可能与所不同。   
    
    
  这个问题要涉及一个基本的知识就是你要知道编译器的处理过程是什么的,知道的结果就是了解source   file和translation   unit的联系和区别。   
  说简单一点translation   unit就是编译器处理过的source   file。处理包括词汇分析,预处理等等,对于你的问题,重要是理解#include的处理意思,是包含#include文件内容使之成为本身的一部分。   
  说到你这个问题,   
  简单说就是“外部连接”的实体(包括变量,函数等)可以在定义实体的translation   unit以外的部分(程序空间)被引用,但是“内部连接”的实体只能在定义实体的translation   unit中使用。   
    
    
  去看看汇编中对于obj文件中的名字连接属性的讲解吧。   
  简单地说就是:一个transunit会编译出一个obj文件,不同的obj文件是分开编译的,在连接时,具有internal   linkage的名字不可能被其他的obj文件所使用,只有具有external   linkage的名字才可以被别的obj文件所使用。   
  举例来说就是,一个函数,如果不具有external   linkage的话,那它只可以在实现它的那个transunit中被调用,在其他的transunit中被调用会引发linker的一个连接错误。   
    
    
  extern   "C"用在C++里表示,被其修饰的函数,类,结构在编译时按照C的编译规则进行,没有mangling   
  在C++中,由于某种原因,比如重载:不同函数体的函数可能有着相同的名字,当然这是相对于程序员来说,实际上,为了区分这些有着相同名字的重载函数,C++编译器偷偷的在背后给这些函数取了特殊的名字以区分它们,这就被称为C++的mangling。   
  同样的,类中的变量有可能与类外的变量同名,当然我们编程时可以用"."来区分,而编译器在编译时,则是通过mangling为类中的变量取了一个独一无二的名字,这个名字显然与程序员所取的名字不同。   
  加了extern   "C"后就不会mangling,函数(或类之成员变量)是什么名字,在编译器编译过程中仍然是这个名字,生成的目标文件.obj里这个函数还是这个名字。   
    
    
  extern   int   a   表示   a是在其它文件中定义的一个变量,需要在这里引用。   
  a已在别的文件中,所以不需要再分配空间了   
    
    
  extern   int   a   定义的a变量表示该变量在使用前已经定义了,一般有两种情况,一是该变量是在其他的文件中定义的全局变量,简称外部变量。二种情况表示变量在本文件中定义的全局变量,但是在使用之后(因为作用域)定义的。   
    
  extern   int   a   是对变量的声明,而不是定义,该变量是其他文件中定义的,或是本文件中在该声明之后定义的全局变量。   
    
    
  extern   int   a;//这是变量声明,是告诉编译器到该文件外部去找这个文件的定义   
                              //声明是不分配内存的   
  int   a;//这是变量定义,变量定义是分配空间的   
  定义只能有一处,但声明可有多处,这些声明所指,都是定义时分配的内存空间   
    
    
  static和extern都被称为"global"变量(或者函数)。   
  但是他们的生存周期和可见性是不同。static是文件级,   
  只有程序文件之间显式的包含才可以引用(主要就是使用#include)   
  但是extern是程序级的,你不必显式的引用文件的,但需要使用extern   
  存储空间修饰符,这个任务编译器,  

分享到:
评论

相关推荐

    extern在C和C++中的作用

    - **`extern "C"`的作用**:当在C++环境中使用C语言库时,需要通过`extern "C"`来避免名字修饰的发生,从而确保函数能够正确地被链接器识别。 #### 使用示例 假设有一个C语言定义的函数`void myFunc(int x);`,...

    嵌入式C/C++语言开发精华文章集锦(嵌入式C/C++开发者必看,很有价值的文章)

    高效编程技术探索,C/C++语言相关技术问题的深层探索,并且对嵌入式C/C++程序员应聘常见面试题进行了深入剖析,对嵌入式C/C++开发者编程修炼,提升自身的相关能力具有很要的作用。 文档包含如下内容: struct 深层...

    MATLAB模糊控制器(*.fis)C/C++接口文件

    * 这是修改过后的fis.c模糊推理系统库函数,可以移植C/C++环境使用,在VS2010的MFC环境经过测试 * 1、将fis.c文件拷贝到项目中; * 2、修改VS2010的配置属性,项目->属性->C/C++->预处理器->预处理器定义,添加 ...

    嵌入式C/C++语言精华文章集锦

    - **`extern "C"` 的功能**:在C++中,为了兼容C语言的函数和变量,我们可以使用`extern "C"`关键字来声明外部链接的符号(即函数或变量)。这样做可以让C++编译器按照C语言的方式进行链接,而不是默认的C++名称修饰...

    嵌入式C/C++精华

    - **结构体的作用:** 在C/C++中,`struct`是一种用户自定义的数据类型,它允许我们将不同类型的变量组合成一个单一的单元。在嵌入式系统开发中,`struct`特别有用,因为它可以用来组织和存储复杂的数据结构,如设备...

    嵌入式C/C++语言精华文章集锦.pdf

    - **跨语言编程**:在混合使用C和C++的项目中,`extern "C"`确保了C++编译器生成的符号名称与C编译器的保持一致,便于两者之间的互操作。 - **库的使用**:当使用C语言编写的库时,`extern "C"`声明是必须的,它保证...

    DSP编程技巧之--从C/C++代码调用汇编代码中的函数与变量

    为了使C/C++能够正确识别和链接汇编函数,需要在C/C++代码中使用`extern "C"`关键字声明这个函数。这样做的原因在于,C++会对其函数名进行名称修饰(Name Mangling),以便处理重载和其他特性。而在汇编中,函数名...

    中兴通讯C/C++笔试题及答案

    4. 在C++程序中调用被C编译器编译后的函数,为什么要加extern "C"声明? extern "C"声明用于告诉C++编译器该函数是用C语言编译的,而不是C++语言编译的。这是因为C++编译器可能会将函数名进行名称 mangling,而...

    Demo: c/c++动态库(DLL)调用,c#等其他语言调用c/c++的DLL

    只需确保C++函数声明遵循C语言的命名约定(通常是extern "C"),并且C语言的DLL导出函数不使用C++特有的特性,如类、模板或异常。 4. **C#调用C/C++ DLL**:C#可以通过.NET Framework的P/Invoke(Platform Invoke)...

    vs2010 C/C++ 调用汇编dll

    在编程世界中,有时我们需要利用低级语言如汇编来实现特定的性能优化或系统级别的操作,然后在高级语言如C/C++项目中调用这些功能。本篇将详细讲解如何在Visual Studio 2010 (VS2010)环境下,创建汇编语言编写的动态...

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    面试题25:关键字static在C和C++中的区别 面试题26:C语言的结构体和C++的有什么区别 面试题27:C中的malloc和C++中的new有什么区别 面试题28:C++的引用和C语言的指针有什么区别 第4章 预处理、保留字 4.1 预处理 ...

    C/C++模糊控制实现

    这个是用MATLAB辅助设计模糊控制器*.fis,使用C/C++来实现模糊控制的接口文件。 首先,使用MATLAB的模糊控制工具箱设计好模糊控制器,即生成的 .fis 文件。 接下来,把 *.fis文件和这里的fis.c文件拷贝到你的C/C++...

    华为C/C++笔试最全试题

    `switch`语句的参数不能为浮点类型,这是因为浮点数的比较在C/C++中不精确,可能导致预期之外的结果。 #### 局部变量与全局变量重名 局部变量可以与全局变量同名,局部变量在函数内优先级高于全局变量,因此在函数...

    Matlab与C/C++语言混合编程的几种方法

    尽管Matlab提供了强大的数据分析和可视化功能,但在实际项目中往往还需要结合C/C++语言来提高程序的运行效率或实现特定功能。例如,在处理大规模数据集时,使用C/C++编写关键计算部分可以显著提升整体性能;而在实现...

    c/c++面试指南

    ### C/C++面试指南知识点概览 #### 第一篇:求职 **1.1 企业与人才** - **1.1.1 企业需要什么...通过以上知识点的学习,面试者不仅可以巩固自己的C/C++基础,还能够提高解决实际问题的能力,从而在面试中脱颖而出。

    C/C++中extern "C" 的作用分析

    `extern "C"` 的作用就是在告诉编译器,即使在C++环境中,也应该按照C语言的规则来处理后面的声明,即不进行名称修饰。这样,C++代码就可以正确地找到和调用C语言定义的函数。 用法上,`extern "C"` 声明通常有两种...

    google search client api for c/c++

    google search client api for c/c++ Google 网站上提供了goole search client api for Java和for dot.net的版本,大家可以参考. For C/C++的版本特点如下 内置XML解析器. 内置gbk/utf-8编码/解码器(包含...

    Android项目下使用JNI进行C/C++和Java互相调用

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言(如C/C++)的代码进行交互。本项目演示了如何在Android应用中使用JNI,实现C/C++与Java的双向调用。以下是关于这个主题...

    嵌入式C/C++编程精华文档

    因为C++和C在函数命名和符号修饰方面有差异,extern"C"可以防止C++编译器对C函数名进行名字修饰,从而使得C代码可以在C++程序中正常链接和使用。 void指针是C/C++中一种特殊的指针类型,可以指向任何类型的数据。...

Global site tag (gtag.js) - Google Analytics