C++ extern(1) extern的用处

本文详细介绍了C++中的extern关键字,解释了如何使用extern来声明在其他文件中定义的变量和函数,以及如何避免重复定义错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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文件中找不到
此时会报错!!
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值