extern的作用

  1、修饰变量的声明

  举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到的。这涉及c语言的另外一个话题——变量的作用域。能够被其他模块以extern修饰符引用到的变量通常是全部变量。还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数func定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数func作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑,好像extern声明只能用于文件作用域似的。在编译阶段,虽然a.c中找不到变量v的定义,但不会出错,因为extern修饰符告诉编译器该变量定义在了其他模块,它会在链接时在b.c模块中找到该变量。

  2、修饰函数的声明

  从本质上来说,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int func(int mu),那么就可以在a.c中声明extern int func(int mu),然后就能使用func来做任何事情。就像变量的声明一样,extern int func(int mu)可以放在a.c中任何地方,而不定非要放在a.c的文件作用域的范围中。对其他模块中函数的引用,最常使用的方法是包含这些函数声明的头文件。使用extern和包含头文件来引用函数有什么区别呢?extern的引用方式是直接了当的,可以选择性的引用,这样做的一个明显的好处是,会加速程序的预处理过程,因为没有了#include的扩展时间。而包含头文件是比较简洁干净省事的做法,这样的好处是包含以后,头文件里所有的声明都可以使用了,不用一个一个使用extern来声明了,节省编码量。

  有一点值得注意,全局变量的声明和定义,如果不加extern是无法区别的,比如int v,既是声明又是定义,默认值为0。所以如果只是声明,一定要用extern修饰,extern int v是声明,可以出现多次;int v是定义,只能出现一次。而函数的声明和定义是显而易见的,声明没有函数体,定义必须要有函数体,所以extern int func(int mu),和int func(int mu)是等价的,函数的声明有没有extern修饰都是可以的。

  3、用于指示C或者C++函数的调用规范。比如在C++中调用c库函数,就需要在C++程序中用extern "c"声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用c函数规范来链接。主要原因是C++支持函数的重载,对于函数名的命名规则和C不一样。

原文地址:https://www.cnblogs.com/nchu-zf/p/10184351.html

时间: 2024-11-09 02:42:12

extern的作用的相关文章

C语言中关键字auto、static、register、const、volatile、extern的作用

原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.extern 这些关键词都是c++基础知识,我整理了一下,希望对新学的朋友们有用: (1)auto 这个这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的. (2)reg

extern 的作用

用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢?? 这个问题一直也是似是而非的困扰着我许久,经过实践和查找资料,有如下总结: 一.头文件 首先说下头文件,其实头文件对计算机而言没什么作用,她只是在预编译时在#include的地方展开一下,没别的意义了,其实头文件主要是给别人看的. 我做过一个实验,

20151023-const、static、extern作用

1.关键字const什么含义 const int a; int const a; const int *a; int const *a; int * const a; int const * const a; 前两个的作用是一样的:a是一个常整型数 第三第四个意味着:a是一个指向常整型数的指针(整型数是不可修改的,但是指针可以) 第五个:a是一个指向整形数的常指针(指针指向的整型数是可以修改的,但是指针不能修改) 最后一个意味着:a是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指

const/static/extern/self/super

一 .const 和 宏 的区别 const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 编译时刻:宏是预编译(编译之前处理),const是编译阶段. 编译检查:宏不做检查,不会报编译错误,只是替换,const会编译检查,会报编译错误. 宏的好处:宏能定义一些函数,方法. const不能. 宏的坏处:使用大量宏,容易造成编译时间久,每次都需要重新替换. 注意: 有很多博客(Blog)描述宏时,说使用宏会消耗很多内存,这种说法并不正确.它并不会生

C++ static,extern ,静态,全局量

1. 静态存储区,是在程序编译时就已经分配好的,在整个运行期间都存在,如全局变量.常量. 2. 栈上分配,函数内的局部变量就是从这分配的,但分配的内存容易有限. 3. 堆上分配,也称动态分配,如我们用new,malloc分配内存,用delete,free来释放的内存. static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;  static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值:全局变量(

关于extern的说明

extern的作用: extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义. 声明外部变量 现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的.也就是说,在编译时,全局变量的可见域限制在文件内部.但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如果某些文件中定义的全局变量名相同的话,在这个时候就会出现重复定义的错误. extern的原理很简单,就是告诉编译器:“你现在编译的文件中,

(转)全局变量、extern/static/const区别与联系

全局变量.extern/static/const区别与联系 编译单元(模块):     在IDE开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(LINK ERROR), 因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌 入式下做开发工作的话,那么你可能非常的理解编译与连接的区别! 当在VC这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,V

c extern小结

extern 的作用是延深文件中变量或者函数的可访问性.主要对全局变量和全局函数其作用.下面是验证的代码: a.c: #include<stdio.h> #include<stdlib.h> int value; //定义一个全局变量 void show() { printf("show something\n"); } b.c: extern int value; void b_show() { value = 100; printf("value:

解析“extern”

解析“extern” 1. 声明外部变量 现代编译器一般採用按文件编译的方式,因此在编译时,各个文件里定义的全局变量是 互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部.以下举一个简单的样例.创建一个project,里面含有A.cpp和B.cpp两个简单的C++源文件: //A.cpp int i; void main() { } //B.cpp int i; 这两个文件极为简单,在A.cpp中我们定义了一个全局变量i,在B中我们也定义了一个全局变量i. 我们对A和B分别编译,都能