extern是一个关键字,它告诉编译器存在着一个变量或函数,如果没有找到相应的变量或函数,会在当前的文件或文件后面定义
先看这么一个例子:
#include<iostream>
using namespace std;
int main() {
i = 0;
func();
system("PAUSE");
return 0;
}
int i;
void func() {
i++;
cout << "i=" << i << endl;
}
这时编译会出错:
'i':indetifier not fonud
'func': identifier not found
上面代码中变量i和func在文件末尾定义,编译器是从上往下进行定义的,这时func和i无法被识别
这时需要extern关键字告诉编译器, 变量在somewhere else
#include<iostream>
using namespace std;
extern int i; //使用extern参数
extern void func();
int main() {
i = 0;
func();
system("PAUSE");
return 0;
}
int i;
void func() {
i++;
cout << "i=" << i << endl;
}
定义其他文件中的函数或变量,就可以用到extern关键字
使用extern关键字调用,这时候函数和变量在.cpp或者.c文件中定义和声明。
使用例子如下:
首先我们在cpp1文件中利用extern声明一个变量i
extern int i;
然后在cpp2文件中再次声明变量i并赋值
int i = 3;
#include<iostream>
using namespace std;
extern int i;
extern void func();
int main() {
func();
system("PAUSE");
return 0;
}
void func() {
i++;
cout << "i=" << i << endl;
}
结果显示i为4
所以用extern关键字声明变量后,编译器会去别的地方寻找该变量
非常类似于函数的预定义
这样就实现了可以在一个cpp文件中声明变量或函数 另一边定义变量或函数
在cpp1文件中声明和调用变量:
#include<iostream>
using namespace std;
extern int i; //声明
extern void func();
int main() {
func();
system("PAUSE");
return 0;
}
在cpp2文件中定义文件:
#include <iostream>
using namespace std;
int i = 3;
void func() {
i++;
cout << "i=" << i << endl;
}
extern关键字的使用可以防止因重复定义而引起的冲突错误:
例子如下:
cpp1文件中:
#include<iostream>
using namespace std;
int i;
extern void func();
int main() {
func();
system("PAUSE");
return 0;
}
cpp2文件中:
#include <iostream>
using namespace std;
int i = 3;
void func() {
i++;
cout << "i=" << i << endl;
}
编译运行时会发生错误:
"int i" (? i@@3HA) already defined in nextFile.obj
重复定义错误,
此时对i加上extern参数就可以防止重复定义.
如果一个工程现编译cpp文件,在把多个目标文件链接成为可执行文件,而两个或多个文件中,定义了相同的全局变量,那么,程序编译的时候会报错,因为编译器单独编译每个文件,在链接可执行文件的时候,由于多个目标文件中含有相同的全局变量,而生成可执行文件的时候,任何文件中定义的全局变量对其它目标文件都是可见的,此时由于变量定义冲突而发生错误
对头文件中的变量或函数不能使用extern关键字
因为头文件在编译期间会把内容插入到cpp文件中
编译的时候只编译cpp文件不编译头文件
如果在头文件中声明extern,被extern声明的变量或函数在其它cpp文件中找不到
此时会报错!!