C++中extern与static的一些简单使用

C++中extern的使用

用extern修饰全局变量

在不同的编译单元(不同的cpp文件)中使用同一个变量,可以使用extern来修饰,这时候其他的编译单元(cpp文件)也可以使用这个变量。
示例代码如下:

//Global.h
#pragma once
extern int a;
//Global.cpp
#include "Global.h"
int a = 1;
//A.h
#pragma once
#include <iostream>
#include "Global.h"

class A {
public:
	void Fuc();
	void Change();
};

//A.cpp
#include "A.h"

void A::Fuc(){
	std::cout << a << std::endl;
	std::cout << &a << std::endl;
}

void A::Change(){
	a = 155;
}
//C.cpp
#include <iostream>
#include "A.h"
#include "Global.h"

using namespace std;

int main()
{
    std::cout << "Hello World!\n";
    cout << a << endl;
    cout << &a << endl;
    A ss;
    ss.Fuc();
    ss.Change();
    cout << "-------------"<<endl;
    cout << a << endl;
    cout << &a << endl;
    ss.Fuc();
    ss.Change();
}

运行的结果为:
在这里插入图片描述
可以发现A.cpp中的a与C.cpp中的a是同一个a,地址是完全相同的。
但是使用extern修饰全局变量的时候要注意不要将声明与定义写在一起,这样会导致extern的修饰无效。

extern int a = 12; //这样等价于 int a = 12;

用extern表明变量在其他编译单元中定义

在某个文件中定义全局变量,在其他的文件中可以使用extern来进行引用。
示例代码如下:

//global.h
#pragma once

int a = 15;
//Class1.h
#pragma once
#include <iostream>

class Class1
{
public:
	void Fuc();
	void Change();
};
//Class1.cpp
#include "Class1.h"

using namespace std;
extern int a;

void Class1::fuc() {
	cout << "Class1中的a值:" << a << endl;
	cout << "Class1中的a地址:" << &a << endl;
}

void Class1::Change() {
	a = 15555;
}
//主函数
#include <iostream>
#include "Class1.h"

using namespace std;
extern int a;
int main()
{
    std::cout << "Hello World!\n";
    cout << a << endl;
    cout << &a << endl;
    Class1 ss;
    ss.Fuc();
    ss.Change();
    cout << a << endl;
    cout << &a << endl;
}

运行结果为:
在这里插入图片描述
可以得知main函数和Class1里面的a都是global.h中定义的那个a值。

用Static修饰全局变量

用static也可以进行全局变量的修饰,对于加static与不加static的全局变量,加了static的话,就不能使用extern进行引用。用static修饰的全局实际上是该编译单元的全局,而extern修饰的全局,不同的编译单元上的全局。
示例代码如下:

//Class.h
#pragma once
#include <iostream>

static int y = 100;

void func();

//Class.cpp
#include "Class.h"

using namespace std;

void func() {
	cout << "Class中的y值:" << y << endl;
	cout << "Class中的y地址:" << &y << endl;
}
//main
#include <iostream>
#include "Class.h"

using namespace std;

int main()
{
    std::cout << "Hello World!\n";
    cout << "Main中的y值:" << y << endl;
    cout << "Main中的y地址:" << &y << endl;
    func();
}

运行结果如下:

可以发现Main中的y与Class中的y实际上是不在同一个地址上,并不是同一个y。

用static修饰局部变量的话是将变量存在内存的静态区,每次的值保存到下次调用,程序结束的时候释放。
运用static的时候也要注意static的声明与定义是必须在一起的,static也不能与extern连用,也尽量把不要把static修饰放在头文件中(应该放在源文件中),这样可以避免引用头文件时不必要的拷贝。

参考网页: C/C++中extern关键字详解.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值