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文件中找不到



此时会报错!!