跳转至

链接

控制链接

  • 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是可以重名的。