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关键字详解.