在C语言,C++和makefile中,include所做的事情实际上是将被include的文件内容原样复制到使用include的文件中
因此在一个头文件中定义一个static变量,然后该头文件被多个cpp文件包含后,包含该头文件的cpp文件实际上会各自拥有独立的同名变量(等同于分别在多个cpp文件中定义同名static变量)
具体验证
在头文件test.h中定义静态变量static int a
//头文件test.h
#pragma once
static int a;
在头文件t0.h中包含头文件test.h,并声明一个可以改变变量a的函数
//头文件t0.h
#pragma once
void change();
//t0.cpp文件
#include"test.h"
#include<iostream>
#include"t0.h"
void change()
{
a = 100;
std::cout << "in t0.cpp " << "a = " << a << " &a = " << &a << std::endl;
}
在main.cpp中包含test.h和t0.h
#include"test.h"
#include"t0.h"
using namespace::std;
int main(int argc, char* argv[])
{
a = 200;
change();
cout << "in main " << " a = " << a << " &a = " << &a << endl;
system("pause");
return 0;
}
运行结果为:
根据运行结果我们可以看出,两个cpp文件中的同名变量a实际上是只在自己头文件范围内有效的(有不同的地址,也就是等同于在各自的cpp中定义static变量,该变量只在定义的cpp文件中有效)
在头文件中定义全局变量
根据include的性质,如果要在头文件中定义一个全局变量是不可以直接定义的。正确的做法应该是在头文件中以extern声明一个全局变量,并在包含该头文件的其中一个源文件中定义该变量,这样其他文件就可以正常使用该全局变量了。