extern关键词的作用

时间:2021-11-26 16:48:05

extern关键词有两个用途:

1. extern "C“ 表示修饰的函数是在C中定义的,告诉编译器编译时按照C的规则来编译。这是由于C++为了实现函数的重载,在编译时会将函数翻译为函数名加参数的形式,例如void foo( int x, int y );会被翻译成类似_foo_int_int的样子,不同的编译器格式不同,但原理类似。那么在C++中调用C的函数时,会找不到C中的函数,因为在C中该函数被翻译成了_foo之类的形式。为了能够在C++中兼容C,所以在include头文件时,需要加上extern "C"。

2.extern修饰变量或者函数,用来声明全局变量,该变量可能在声明的文件中之后的地方定义,也可能在其他文件中定义。要想搞明白这个,需要首先弄清楚声明和定义的区别。

首先看一下声明和定义的区别:

①变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。

②变量声明:用于向程序表明变量的类型和名字。

③定义也是声明:当定义变量时我们声明了它的类型和名字。

比如下面的例子:

 1 int i;       //声明一个变量i
 2 i = 0;       //定义变量i
 3 int b = 0;   //声明并且定义变量b
 4 
 5 int add(int a, int b);      //声明一个函数add
 6 
 7 int add(int a, int b)       //定义函数add
 8 {
 9     return a + b;
10 }

 

清楚了声明和定义的区别之后,就来看extern的具体用法。

1.在当前文件中声明全局变量

 1 #include "stdafx.h"
 2 #include<iostream>
 3 using namespace std;
 4 
 5 int _tmain(int argc, _TCHAR* argv[])
 6 {
 7     extern void func();    //声明全局函数func
 8     func();
 9 
10     extern int i;         //声明全局变量i
11     cout << i;
12     return 0;
13 
14 }
15 
16 int i = 5;
17 void func()
18 {
19     cout << "func called!\n";
20 }

 

2.在其他文件中声明全局变量,这种情况用于A.cpp要使用B.cpp中的全局变量,那么可以在B.h中声明全局变量,在B.cpp中定义全局变量,这样A将B的头文件引入后,就可以使用了

1 //B.h
2 
3 extern int i;
1 //B.cpp
2 
3 #include "B.h"
4 int i = 5;
 1 // A.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<iostream>
 6 #include"B.h"
 7 using namespace std;
 8 
 9 int _tmain(int argc, _TCHAR* argv[])
10 {
11     cout << i;
12     return 0;
13 }

 

3. static修饰全局变量

static修饰全局变量与extern恰好相反,static修饰的全局变量只能被当前文件使用,而无法在其他文件中使用