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中的作用相区分,帮助大家更好的理解。
高效编程技术探索,C/C++语言相关技术问题的深层探索,并且对嵌入式C/C++程序员应聘常见面试题进行了深入剖析,对嵌入式C/C++开发者编程修炼,提升自身的相关能力具有很要的作用。 文档包含如下内容: struct 深层...
* 这是修改过后的fis.c模糊推理系统库函数,可以移植C/C++环境使用,在VS2010的MFC环境经过测试 * 1、将fis.c文件拷贝到项目中; * 2、修改VS2010的配置属性,项目->属性->C/C++->预处理器->预处理器定义,添加 ...
这个是用MATLAB辅助设计模糊控制器*.fis,使用C/C++来实现模糊控制的接口文件。 首先,使用MATLAB的模糊控制工具箱设计好模糊控制器,即生成的 .fis 文件。 接下来,把 *.fis文件和这里的fis.c文件拷贝到你的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编码/解码器(包含...
主要介绍了C/C++中extern "C" 的作用,是在进行C/C++程序设计中非常常见的用法,需要的朋友可以参考下
我们经常会在C/C++程序中见到extern “C”,这是一个很重要的概念。本文就来以实例形式讲述C/C++中extern “C”的作用。分享给大家供大家参考之用。具体分析如下: 作用:实现C和C++混合编程。 原理:C和C++编译器...
1.extern “C” 导出(互相传值比较麻烦,不建议使用这种方式): 将C/C++库做成和平常一样的DLL和或者.so,比如: //.h文件 #include //.cpp文件 //C/C++ my.so 或者my.dll enter "C" void printHello() { std:...
在C/C++编程过程中,经常会进行变量和函数的声明和定义,各个模块间共用同一个全局变量时,此时extern就派上用场了。 定义 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此...
面试题25:关键字static在C和C++中的区别 面试题26:C语言的结构体和C++的有什么区别 面试题27:C中的malloc和C++中的new有什么区别 面试题28:C++的引用和C语言的指针有什么区别 第4章 预处理、保留字 4.1 预处理 ...
C++中extern "C"含义深层探索........................................................................7 C 语言高效编程的几招..................................................................................
c/c++中如何实现动态库动态加载的完整工程示例代码: 本代码将将win、linux加载、卸载动态库,并从动态库链接模块中获取类实例或函数地址等封装成统一的API接口,并集成在dllLoad.h/dllLoad.cpp中实现。构建一个注册...
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern "C"修饰的变 量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调 用C 函数。C++提供了一个C 连接交换指定符号...
本篇文章是对C/C++中的static与extern关键字的使用进行了详细的分析介绍,需要的朋友参考下
主要介绍了C/C++中extern关键字详解 的相关资料,需要的朋友可以参考下
C++中 extern "C"含义深层探索 C 语言高效编程的几招 想成为嵌入式程序员应知道的 0x10 个基本问题 C 语言嵌入式系统编程修炼 C 语言嵌入式系统编程修炼之一:背景篇 C 语言嵌入式系统编程修炼之二:软件架构篇 C 语言...
C++中extern “C”含义深层探索
主要内容包括但不限于:volatile关键字、sizeof & strlen、const的作用、enum、inline、delete[] 与 delete、多态的作用、C++与Python的区别、深拷贝与浅拷贝、extern C、C++内存管理、封装 / 继承 / 多态、引用 & ...
extern关键字的作用