链接¶
控制链接¶
- static
- extern
- register
- auto
四种存储类型说明符
后两个没什么用了,重要的是前面两个进行链接控制。
这四种在C语言就有了,在C++中继续使用。
- 在函数内部定义的局部变量。 默认有一个auto可以不写。
- 在函数外部定义的全局变量。默认的是extern(外部的),一般也是不写。
在函数内部还可以用register,static,extern 定义或声明。
在函数外部还可以用extern ,static。但是不能用auto没有这种写法。register也只能用在函数的内部。
函数默认的也是extern,extern可以默认不写。也可以写static,但是不能写auto,不能register。
register¶
把变量放在寄存器里,如果不放在寄存器里,默认放在内存里,寄存器在电脑里的速度最快。
C和C++编译器会根据情况判断能不能放在寄存器里,如果能放,没有写register也会放寄存器里。不能放的话写了也不会放。所以写不写register没什么用。
static¶
静态的,使用static 是静态数据区。
在函数内部:生命周期是整个函数结束之后消失。
在外面:生命周期就是整个文件的周期
函数加了static就是文件内部的函数,避免和其它文件的冲突。
extern¶
外部的
extern和static一起使用。
计算机语言,C和C++做设计的时候有四个重要的步骤:
预处理 —> 编译 —> 汇编 —> 链接
链接:static external是在这个时候作用。
程序设计的时候有多个文件,每一个文件里都可以写函数,声明变量等。
如果不同的文件变量是完全不同的名称,那么就无所谓,名字不重复。
问题是:
不同的文件链接的时候 变量名 函数名重名,会冲突,链接会失败。
不同文件里面定义了同名的变量,并且都是外部的(extern),就会发生冲突。重名了。
在链接的时候不允许重复名子。
定义静态的就没问题。不同的文件里面定义同名的变量,变量都是static静态的,就不会有问题。
原因:静态的static是在当前文件内部使用的。链接时不检查。
类似:不同的函数里面定义一样的变量名。
如果是外部的,当前文件可以用,其它的文件也可以用,所有文件都可以用。所以就会发生冲突。
在一个文件里定义一个全局变量int m;
,所有的源文件都可以使用。
在其它文件定义一个重名的变量是不可以的,可以使用extern int m;
这只是一个声明,在这个文件就可以用了。
在一个文件定义静态的static int n;
只在当前文件使用。可以多个文件重名,没有关系。
函数¶
- 外部的 extern
其它的文件也可以用它,是全局的。
- 静态的static
当前的文件可以使用该方法,其它文件不能使用。
不同文件同名的全局函数不行。不同文件同名的静态函数可以。
在一个文件定义一个全局的函数,在另一个文件中只需做一个声明extern void f();
然后就可以使用。
全局的变量和函数 以及声明可以在同一个文件中,也可以在其它文件中去声明使用。
全局变量,全局函数有可能会重复
在C语言没法解决,只能统一命名规则避免重复
在C++,提供了名字空间namespace,名称在不同namespace是可以重名的。