C++ extern(1) extern的用处

来源:互联网 发布:分布式数据库的安全性 编辑:程序博客网 时间:2024/05/18 23:57
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;

回到cpp1文件中,我们调用func函数输出i++
#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;}

编译运行时会发生错误:
LNK2005 "int i" (? i@@3HA) already defined in nextFile.obj
重复定义错误,
此时对i加上extern参数就可以防止重复定义.

如果一个工程现编译cpp文件,在把多个目标文件链接成为可执行文件,而两个或多个文件中,定义了相同的全局变量,那么,程序编译的时候会报错,因为编译器单独编译每个文件,在链接可执行文件的时候,由于多个目标文件中含有相同的全局变量,而生成可执行文件的时候,任何文件中定义的全局变量对其它目标文件都是可见的,此时由于变量定义冲突而发生错误

对头文件中的变量或函数不能使用extern关键字
因为头文件在编译期间会把内容插入到cpp文件中
编译的时候只编译cpp文件不编译头文件
如果在头文件中声明extern,被extern声明的变量或函数在其它cpp文件中找不到
此时会报错!!
























原创粉丝点击