extern和static(全局变量的声明和定义分离)

全局变量声明和定义分离


写在前面

关键字生命周期作用域在头文件中修饰变量
extern静态(程序结束后释放)整个程序属于声明
static静态(程序结束后释放)仅存在于单个源文件(编译单元)属于定义
  • extern只是声明了这个变量的存在,在.cpp文件中定义时的全局变量在整个项目中都可以使用
  • static定义了这个变量,然后头文件分别和两个.cpp文件合并生成两个.obj文件,再生成可执行程序,这个变量在两个.cpp文件都是可见的,并且占用不同的地址空间

详情见下:


extern声明的全局变量

extern int a;//放在.h中,属于声明
int a = 10;//放在.cpp中,属于定义

这里主要探讨关于extern int a;放在头文件中的问题

//class.h
#pragma once

#include <iostream>
using namespace std;

extern int a;

int text();
//class.cpp
#define  _CRT_SECURE_NO_WARNINGS

#include "class.h"

int a = 10;

int main()
{
	text();
	cout << "main():" << a << "," << &a << endl;
	return 0;
}
//test.cpp
#define  _CRT_SECURE_NO_WARNINGS

#include "class.h"

int text()
{
	cout << "text():" << a << "," << &a << endl;
	a++;
	return 0;
}

运行结果:

image-20230730092345388

可以看到这里text和main调用的都是同一变量,在不同文件中也可做修改。

也就是说

  • extern只是声明了这个变量的存在,在.cpp文件中定义时的全局变量在整个项目中都可以使用

static修饰的变量

int age = 100;//放在.h中

这中写法会放入符号表并且所有文件可见,同时会产生一个问题,也就是所有文件可见的话在一个项目中不同的文件都可以调用的话就会造成同一个变量的重定义。

static int age = 10;//放在.h中

这种写法不会放入符号表,只有当前文件可见,但当我们在不同文件中进行打印的时候会发现,不同文件对于同一名称的变量的将进行赋值和取地址的时候获得的值也不同,详细见下


这里主要探讨关于static int age = 10;放在头文件中的问题

//class.h
#pragma once

#include <iostream>
using namespace std;

static int age = 100;//所有文件可见,属于定义

void text();
//text.cpp
#define  _CRT_SECURE_NO_WARNINGS

#include "class.h"

void text()
{
	cout << "text():" << age << endl;
	cout << "text():" << &age << endl;
	age++;
	cout << "text2():" << age << endl;
	cout << "text2():" << &age << endl;
}
//class.cpp
#define  _CRT_SECURE_NO_WARNINGS

#include "class.h"

int main()
{
	text();
    cout << endl << endl;
	cout << "main():" << age << endl;
	cout << "main():" << &age << endl;
	age++;
	age++;
	age++;
	age++;
	age++;
	cout << "main()2:" << age << endl;
	cout << "main()2:" << &age << endl;
	return 0;
}

运行结果:

全局变量声明和定义分离_static

通过这里我们可以看到在不同的.cpp中访问到的.h中被static修饰的变量的地址都不同,可以理解为是在头文件展开的时候在不同的文件中都会进行一次定义,所以就会造成不同.cpp中变量的名称相同但是变量的地址不同。

  • static定义了这个变量,然后头文件分别和两个.cpp文件合并生成两个.obj文件,再生成可执行程序,这个变量在两个.cpp文件都是可见的,并且占用不同的地址空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值