在项目中遇到了一个问题,当我们在头文件定义一个变量,而在所有包含该变量的cpp文件中都想使用这个变量,且每次使用该变量,该变量值都不同,我们应该怎么处理。
这时候最简单的方法当然是使用静态变量static。
在头文件中定义全局变量时使用static,意味着该变量的作用域只限于它的源文件中,其他源文件不能访问。
既然这种定义方式出现在头文件中,那么可以很自然的推测:包含了该头文件的所有源文件都可以使用该静态变量,且变量值会随着每个cpp文件变化而改变。
如果我们在头文件<commonTool.h>中给static变量定义,并声明两个函数use1,use2去调用静态变量,如
#pragma once
#include <iostream>
using namespace std;
static int i = 5;
void use1();
void use2();
如果我们在调用commonTools.h头文件的cpp文件中使用static变量,并改变static变量值,是不是可以推断改变的static变量值会在其他cpp文件中得到反映。cpp文件如下
<service1.cpp>
#include "common_tools.h"
void use1()
{
cout <<"this is sevice1:" << i++ << endl;
cout << "this is sevice1:" << i++ << endl;
cout << "this is sevice1:" << i++ << endl;
cout << "this is sevice1:" << i++ << endl;
cout << "this is sevice1:" << i++ << endl;
}
<service2.cpp>
#include "common_tools.h"
void use2()
{
cout << "this is sevice2:" << i++ << endl;
cout << "this is sevice2:" << i++ << endl;
cout << "this is sevice2:" << i++ << endl;
cout << "this is sevice2:" << i++ << endl;
cout << "this is sevice2:" << i++ << endl;
cout << "this is sevice2:" << i++ << endl;
}
在main函数中调用<commonTools.h>文件并输出结果
#include "common_tools.h"
int main()
{
use1();
use2();
system("pause");
return 0;
}
结果为
可以发现,在每个cpp文件中对static变量的改变并不会引起其他cpp文件中static变量的改变。
因此那么可以很自然的推测:包含了该头文件的所有源文件中都定义了这些变量,即该头文件被包含了多少次,这些变量就被定义了多少次。且每个cpp文件的静态变量不会相互影响。
解决方案:
1、extern全局声明
使用这种方法并不能帮助我们在每个cpp中获取唯一的ID,可以通过在头文件中声明extern变量,然后在某一个cpp文件中定义,就可以解决这个问题,如下。
在commonTools.h中用extern声明
extern int i;
在任意包含 commonTools.h的cpp文件中定义即可。
2、静态类:在头文件中定义单例类,并在子cpp文件中调用可以获取唯一ID
class AllocUniqueID
{
public:
AllocUniqueID() = delete;
AllocUniqueID& operator=(const AllocUniqueID&) = delete;
private:
AllocUniqueID()
{
m_id = 1;
}
~AllocUniqueID()
{
}
public:
static AllocUniqueID* instance()
{
static AllocUniqueID allocUniqueID;
return &allocUniqueID;
}
int getUniqueID()
{
return m_id;
}
private:
int m_id;
};
在cpp文件中调用静态类
cout <<"this is sevice1:" << AllocUniqueID::instance()->getUniqueID() << endl;
在每个包含头文件的cpp文件中直接调用也不会出现变量值的重复。
结果