static关键字

何时使用static

  • 请况一:当我们定义一个函数,该函数仅限于在定义它的源文件下使用,此时可以使用”static”修饰,以对外界隐藏该函数.
  • 情况二:同样,定义一个全局变量,该变量仅在定义它的源文件下使用,此时可以使用”static”修饰,达到隐藏的目的.
  • 情况三:对于一个局部变量,如果我们有意不让其存储在栈(自动变量)上,而是存储在静态存储区(.data,.bss),可以使用static修饰.
    前两种情况都是限定符号的作用域,第三种情况属于改变变量的生命周期.

static的作用如何实现的

首先清楚c/c++的分离式编译,每个.c文件都首先经过编译成目标文件(.o文件),再经过链接形成可执行文件。

static修改链接属性

使用static修饰全局变量或者函数,其实修饰的都是符号。对编译其来说,以static修饰的符号,其属性的本地属性,即在链接的时候,不会被链接器处理。这样就达到了向外界(其他目标文件)隐藏的目的。

static局部变量(静态局部变量)

静态局部变量仅仅是编译器在编译的时候,在程序的静态存储区(.bss,.data)为该变量预留空间。未初始化的静态局部变量存储在.bss段,已初始化的静态局部变量存储在.data。其生命周期就从初始化时刻到程序结束。栈上变量(自动变量)的生命周期只局限函数内部。

static和extern

extern并不能改变static的作用效果。

extern关键字的作用仅仅是告诉编译器,该符号的定义在外部。

  • 对于全局变量来说,extern的作用是告诉编译器,该符号在其他源文件里面。
  • 对于函数来说,extern的作用和#include “*.h”的作用是相似的,相当于声明。在两个目标模块的联系仅仅是几个函数,就可以使用这种方法,而不需要include包含整个头文件。