C语言中的static

在c语言中static有两个作用,

  1. 一个是在函数中声明变量,这样就不会在函数的每次调用中都会重新初始化其值。
  2. 二是声明全局的静态变量或者函数。对于声明的静态变量或者函数,那么它就只能在本编译单元可见,其他编译单元中不可见。那么什么叫做一个编译单元呢?一般来讲,一个c源文件就是一个编译单元,那么头文件是怎么处理的呢?在预处理的时候,预处理器会把include的头文件都展开到当前源文件中,然后由编译器来编译。这样,我们就可以说,对于编译器来讲,它是见不到所谓的头文件的,因为它在预处理阶段就已经由预处理器给消灭掉了,即展开了。所以如果你在头文件中定义了一个static变量,那么在每个include了它的源文件中都会有一个这样的变量,而且他们相互之间不可见。所以,如果你想定一个全局变量,跨多个编译单元可见的全局变量,那么你不能把它定义为static的。只能在一个源文件中定义为非static的,然后在头文件中使用extern来声明。然后在其他编译单元中通过include这个头文件来使用这个全局变量。同时,也不能通过在头文件中定义一个非static变量的方式来实现,因为这样头文件会被展开到多个源文件中,从而造成在多个源文件中重复定义同一个变量的错误。另外,如果源文件的某些函数是你不希望外部使用的,就好比cpp的private函数一样,那么你应该把它定义为static的。reference

猜你喜欢

转载自www.cnblogs.com/willhua/p/11764608.html