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修饰的全局变量只能被当前文件使用,而无法在其他文件中使用