1、不加static修饰,置于任何作用域之外,是个全局作用域,其实就是通常我们所说的全局变量。这叫外部连接属性,它可以跨文件使用;它一般在头文件中声明,注意!这里说的是声明而不是定义,也就说不是初始化。
在这里提一下用const去修饰的全局变量,一个用const去修饰的全局变量相当于具有内部连接属性的静态变量,不过它不接受改变哦!
那这又是为啥呢?因为如果它不具有内部连接属性,那在多文件编译中就很容易出现多重定义的错误,因为常量多是定义在头文件中的嘛,这不符合C++中一个定义的原则。而且,在头文件中你只能声明具有外部连接属性的变量,而常量你必须进行定义,所以常量通常情况下是内部连接属性。
但是有时候你就想让const常量也具有外部连接属性,那怎么办?方法是使用extern去修饰这个const常量的定义,不过只能定义一次,然后再在你使用这个const常量的其他源码文件中用extern去声明一下就好了,如下图所示:
2、加static修饰,置于任何作用域之外,也是全局变量,只不过它仅局限于本源码文件中。这个叫内部连接属性;
3、加static修饰,置于作用域之内,这个叫没有连接属性的,和普通的局部变量一样。不同的是,这3个变量都常驻内存。
它一般局限于函数定义域之内,也被称为本地变量。此时它仍然常驻内存,但是它的作用域并不大。可能包含它的函数并不活动了,但是它仍然存在,并且该种变量只要定义一次即可,当重复调用该函数时,尤其是该函数是递归函数时不会出现重复定义的错误,并且它可以保留先前的值,供下一次计算使用。如下图所示:
从这个结果来看变量a的地址都是一样的,但是它的值是递增的。