规则
全局变量只能在头文件申明,不能在头文件定义。
- 工程全局变量
声明方式是头文件中extern 来声明, 原因是如果放在global.h中定义的话,就会出现global.obj和other.obj定义冲突的问题。
//global.h
extern int num; // 如果不加extern默认是extern, 这里要有良好的编程习惯,不要用默认,该写出来就要写出来
extern double* ptr;
//global.cc
int nun = 1;
double* ptr = new double(4);
//other.cc
#include "global.h"
#include "other.h"
#include <iostream>
void show()
{
std::cout<<num<<std::endl;
}
- 编译单元全局变量
声明方式是源文件中static 来声明,static修饰的全局变量声明与定义同时进行,也就是说使用static声明了全局变量后,它也同时被定义了,是如果放在global.h中声明定义的话,就会出现global.obj和other.obj各出现一个变量,如果other不用的话就会浪费内存,而且编译器的优化也会给我们定位问题带来困扰,所以直接声明和定义都放在.cpp文件中就可以了。
//global.cc
static int nun = 1;
static double* ptr = new double(4);
const修饰的全局常量
const 默认就是static, 这里就可以看到C++很奇怪,非const全局变量是默认extern, const全局变量是默认是static。 其他和上面没啥区别。
参考
https://www.cnblogs.com/catkins/p/5270388.html