浅析extern和static的区别

本文详细介绍了C++中的extern和static关键字。extern用于声明函数和变量在其他文件中定义,允许不同文件间共享代码。static则使变量在程序运行期间持续存在,且限制其作用域。在局部作用域中,static让变量保持其状态;在全局作用域中,static使变量私有化,仅在当前文件可见。
摘要由CSDN通过智能技术生成

目录

1.extern

  (1)概念

  (2)用法

  (3)注意事项

  (4)总结  

2.static

  (1)概念

  (2)用法

  (3)特点


1.extern

  (1)概念

        extern关键字,一般用在变量名前或函数名前,用来告诉编译器“这个变量/函数是在别处定义的,要在此处引用”。

        使用语法:extern 函数声明或变量声明

  (2)用法

        1.声明外部函数:在A.cpp文件中声明一个函数,B.cpp文件也想使用此函数,可以在B.cpp中利用关键字extern实现。通过代码一和代码二共同完成验证。(本文代码均在win10系统VS2019进行验证)

        代码一:在other.cpp中定义一个函数。

//代码一
#include "iostream"
using namespace std;

//other.cpp中定义求矩形面积的函数
void area(int longth,int wide) {
	cout << "矩形面积:" << longth * wide << endl;
}

        代码二:在main.cpp中使用在other.cpp中定义的函数。

//代码二
#include "iostream"
using namespace std;

//main.cpp
extern void area(int longth, int wide);//声明函数时,extern可以取消。
int main() {
	area(3, 4);//输出 矩形面积:12
}

        2.声明外部全局变量:在A.cpp文件中声明一个全局变量,B.cpp文件也想使用此变量,可以在B.cpp中利用关键字extern实现。通过代码三和代码四共同验证。

        代码三:在other.cpp中定义一个全局变量。

//代码三
#include "iostream"
using namespace std;

//other.cpp中定义一个全局变量
int longth = 120;

        代码四:在main.cpp中使用在other.cpp中定义的全局变量。

//代码四
#include "iostream"
using namespace std;

//main.cpp
extern int longth;
int main() {
	cout << "longht = " << longth << endl;//输出 longht = 120
}

        3.extern声明本文件内的函数或变量:在A.cpp中修饰A.cpp的函数或变量

        代码五:

//代码五
#include "iostream"
using namespace std;

//main.cpp
extern void area(int longth, int wide);
extern int lon;
int main() {
	area(3, 4);//输出 矩形面积:12
	cout << "lon = " << lon << endl;//输出 lon = 10
}

void area(int longth, int wide) {
	cout << "矩形面积:" << longth * wide << endl;
}

int lon = 10;

  (3)注意事项

        1.重定义错误:当A.cpp中存在一个和B.cpp中相同的函数或变量X时,如果在A中用extern声明X时,就会产生重定义错误。

        2.无定义错误:在A.cpp中使用extern声明了一个函数,但在链接过程中没有在任何cpp文件中发现此函数的定义。(举例:在银行如果没有存钱,却想要去取钱,这就是错误的。)

  (4)总结  

        extern一般是在多文件之间需要共享某些代码时使用,并且这些文件需要在同一项目下。告诉编译器,同一项目下在某个cpp文件中,存在这么一个函数或变量。

2.static

  (1)概念

        将被static修饰的变量存储在静态区,在整个程序的运行区间都存在,程序结束后释放。

  (2)用法

        1.修饰局部变量

        代码六:修饰局部变量时,会将该变量的变化保存,代码如下。

//代码六
#include "iostream"
using namespace std;

void Prin() {
	static int m = 0;
	cout << m << " ";
	m++;
}

int main() {
	int num = 5;
	while (num) {
		Prin();
		num--;
	}//输出 0 1 2 3 4
}

        2.修饰全局变量

        代码七:修饰全局变量时,本文件内的成员将共享这个全局变量。

//代码七
#include "iostream"
using namespace std;

static int m = 0;

void P1() {
	cout << "P1:" << m<<endl;
	m = 5;
}

void P2() {
	cout << "P2:" << m << endl;
}

int main() {
	P1();//输出 P1:0
	P2();//输出 P2:5
}

  (3)特点

        static修饰全局成员时会将成员私有化,使得只能在本cpp文件中使用。通过代码八和九进行验证

        代码八:在other.cpp中定义static成员。

//代码八
#include "iostream"
using namespace std;

//other.cpp中定义静态成员
static int m = 10;

static void Prin() {
	cout << "Prin()" << endl;
}

        代码九:在main.cpp中声明static成员时失败,编译器报错。

//代码九
#include "iostream"
using namespace std;

//main.cpp

//extern int m; 会报错
//extern static int m; 会报错

//extern void Prin(); 会报错
//static extern void Prin(); 会报错

int main() {
	//cout << "m:" << m << endl;
	//Prin();
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值