C/C++中关键字extern详解

目录

1.extern功能详解

C/C++中关键字extern不外乎有下面几个作用,只要记住了这几个规则就可以在项目中运用自如。
① 扩展外部变量的作用域(在同一个文件范围内)
② 将外部变量的作用域扩展到其他文件
③ 将外部函数(函数名前面没有加static关键字)的作用域扩展到其他文件

现在来对上面列举的3个功能做详细的讲解:
我们知道,在用C/C++进行编程时候,所以的变量或函数都必须先定义,再使用(一些脚本语言如:shell、python等除外)。若使用了一个未定义的变量或函数,在编译时编译器就会报错,并提示该变量或函数未定义,操作、使用非法的变量/函数。而且定义的变量、函数还会涉及到一个很重要的概念:作用域。作用域的概念其实很简单,不要把它想得太复杂。就拿生活中的河里的鱼来举例,鱼只能生活在水里,脱离了水后鱼便会因为缺氧而亡。因此这条河就是鱼生活的活动范围,生存区间。也就是说鱼的作用域便在这条河的范围内。同样,代码中的变量和函数也有自己的范围区间,若在超过了这个区间的其他地方使用则无效,报错。

(1)扩展外部变量的作用域(在同一个文件范围内)

代码 1

/*************************************************************************
 * File Name: sum.cpp
 * Author:    The answer
 * Function:  Other        
 * Mail:      [email protected] 
 * Created Time: 2018年05月10日 星期四 00时14分19秒
 ************************************************************************/

#include<iostream>
using namespace std;

int SumFunc(int,int);   //函数声明

int main(int argc,char **argv)
{
    extern int Sum;     //extern                                                                                                                                                     
    Sum = SumFunc(66,88);
    cout<<"Sum: "<<Sum<<endl;
    return 0;
}

int Sum = 0;
int SumFunc(int a,int b)
{
    Sum = a+b;
    return Sum;
}


执行结果:Sum: 154
该文件中,变量 Sum 定义到了main函数的外面,因此Sum变量的作用域对于main而言是不可见的,该变量Sum的作用域为从定义处开始一直到本文件结束。但是现在我们需要在main函数中使用该变量,因此需要用到 extern 关键字来进行声明、扩展外部变量Sum 的作用域,使其在main函数内部也可见。
这里有 5 个地方值得注意:
(1). 必须对函数SumFunc进行声明。声明的作用是:把函数名、函数参数个数、参数类型和函数的返回值告知编译系统,以便用到函数的调用时,编译器能够正确的识别并检查其调用方法是否合法、正确。(注意:在声明时,函数的参数可以不写参数名字,只写类型就可以了)

(2)在声明 extern int Sum;的时候,不要对 extern int Sum;进行赋值,如: extern int Sum = 10;这是错误的。
(3)外部变量(普通全局变量)只能够定义一次,但是可以声明多次。如上面的extern int Sum;声明.写成这样也不会报错:
extern int Sum;
extern int Sum;
extern int Sum;
extern int Sum;
这里声明了 4 次,也能够编译通过。

(4)extern只能声明外部变量(普通全局变量),是配合全局变量使用。
(5)全局变量定义时候初始化为0(为了直观,即使不初始化也为0);而声明全局变量时候,加上extern关键字。


(2)将外部变量的作用域扩展到其他文件

代码 2
这里写图片描述

在C/C++中,一个程序可以由一个或多个源程序文件组成。若是只有一个文件,使用方法 就可以解决问题。但是若有一个或多个源文件组成,而刚好此时一个文件中需要使用另外文件中的变量,那么就得使用到 extern 关键字来进行声明,告知编译器,该变量是有定义的,在其他源文件的某个地方。

上面的代码2中,该程序由 2 个源文件组成,其中 main.c 是程序运行的主函数,而 Global.c 中定义了全局变量 int A = 10; 现在主程序main.c中需要用到这个 A 变量,所以在使用该变量A时,得先对其进行声明。(在没有声明的情况下,直接使用时候,会报错)。

至于该int A变量的声明放在哪里,这个无所谓,都可以。只有在引用之前声明都行。如下图:
这里写图片描述

重点:在编译的时候,需要把Global.c也加入进去一起进行编译。如:gcc main.c Global.c -o app 或直接使用Makefile都可。

该程序运行结果:A[10]


(3)将外部函数(函数名前面没有加static关键字)的作用域扩展到其他文件

代码 3
这里写图片描述

复用代码 (2),现在在Global.c中多加了一个Add()函数,用来求和的。该函数的作用域为在Global.c 的整个文件访问内有效,但是对于main.c 是不可见的。若在main.c中来使用该函数,通用得使用 extern 来进行声明。这样就可以在main.c中来使用该函数了。编译方式同代码 2 相同。

执行结果:
A[10]
Sum[30]

猜你喜欢

转载自blog.csdn.net/lixiaogang_theanswer/article/details/80261864