1. 对于全局变量,改变它的作用域,使其只能在本源文件里面使用
    最开始,在头文件里面定义一个全局变量,然后在main里面,extern 声明,结果报错了
//Header.h
#pragma once
int num = 0;
//Header.cpp
#include"Header.h"
//main.cpp
#include <iostream>
using namespace std;
extern int num;
int main()
{
   
	cout << num << endl;
	return 0;
}


放到cpp里面,就可以了

//Header.h
#pragma once
//Header.cpp
#include"Header.h"
int num = 0;
//main.cpp
#include <iostream>
using namespace std;
extern int num;
int main()
{
   
	cout << num << endl;
	return 0;
}

然后,我又换回去,在头文件里面定义,在cpp里面使用一次,这样又可以了

//Header.h
#pragma once
int num = 0;
//Header.cpp
#include"Header.h"
int d = num;
//main.cpp
#include <iostream>
using namespace std;
extern int num;
int main()
{
   
	cout << num << endl;
	return 0;
}

究其原因:

编译器的工作过程可以分为以上的四个阶段:
 在预处理阶段,编译器是以c文件为单位进行处理的,当遇到一个头文件,会对其进行搜索,如果是尖括号,则直接在系统目录下搜索,如果是双引号,则首先在工程目录下搜索,然后在C安装目录搜索,最后在系统目录下搜索。搜索完毕后,会将头文件的内容拷贝到对应的包含头文件的c文件里面,形成一个中间c文件,然后对其进行处理。
 如果在多个c文件里面包含了同一个头文件,恰巧该头文件里面定义了一个全局变量,那么多个c文件中存在相同的变量名拷贝,也就是变量被存放到DATA段,并且是多份;因此我们要避免在头文件里面定义全局变量;
 正确的形式是,在c文件里面定义全局变量,然后,可以写一个头文件,里面extern 声明这个变量,最后在需要用到该变量的地方,包含这个头文件;

//Header_global.h
#pragma once
extern int num ;
extern int num2 ;
//Header.cpp
#include"Header.h"
int num=0;
//Header2.cpp
#include"Header.h"
int num2=0;
//main.cpp
#include <iostream>
using namespace std;
//extern int num;
Header_global.h

int main()
{
   
	cout << num << endl<<num2<<endl;
	return 0;
}

当然,也可以手动在需要的地方extern 需要的变量,但是在工程实现的时候,如果存在多个变量,采用这样的一种方式,易读,便于后期维护
2. 对于静态局部变量,改变了它的生命期,也就是存储的位置不在栈,而是在静态存储区,在函数调用完毕后,内存没有被释放
3. 对于类的成员变量来说,也是改变了生命期,然后不计入类的大小计算
4. 对于类的成员函数来说,定义为static,在调用的时候不用定义对象,然后调用,而是变味了类的成员函数