c语言中的static关键字

174 阅读1分钟

static关键字有两个完全不同的功能

  1. 对于局部变量,用static声明,表示变量和全局变量一样,分配在静态存储区,这个变量在整个程序执行期间不释放。因此在调用时一定要注意static变量的值。
  2. 对于全局变量,使用static声明,表示此变量的作用域仅限于本文件。(和extern相对应,表示声明(declare)这个变量,且这个变量在其他文件内已经定义(define))。同样可以修饰函数,函数默认是extren类型,外部可以调用,如果声明为static,该函数只可以在本文件内调用。

例子一:

#include<stdio.h> 
int fun1() 
{ 
  int i = 0; 
  i++; 
  return i; 
} 
int fun2() 
{ 
  static int j = 0; 
  j++; 
  return count; 
} 
   
int main() 
{ 
  printf("%d ", fun1()); 
  printf("%d ", fun1()); 
  printf("%d ", fun2()); 
  printf("%d ", fun2()); 
  return 0; 
}

输出:

1 1 1 2 

例子二:

// main.c
#include<stdio.h> 

int foo = 0;

int fun1() 
{ 
  int i = 0; 
  i++; 
  return i; 
} 

// test.c
#include<stdio.h> 

int foo = 0;

int fun1() 
{ 
  int i = 0; 
  i++; 
  return i; 
} 

运行程序:

duplicate symbol '_foo' in:
    CMakeFiles/untitled.dir/main.cpp.o
    CMakeFiles/untitled.dir/test.cpp.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

相同名称的全局变量会冲突,解决方法就是使用static修饰,表明该变量只在这个文件中生效。

// test.c
#include<stdio.h> 

static int foo = 0;

int fun1() 
{ 
  int i = 0; 
  i++; 
  return i; 
}