c语言|C语言static关键字


目录

  • static关键字
    • 修饰局部变量
    • 修饰全局变量
    • 修饰函数

static关键字
  1. static修饰局部变量
使得局部变量出了自己的范围也不销毁,其实是改变了其生命周期 但是作用域还是局部的。
  1. static修饰全局变量
  2. static修饰函数
修饰局部变量 不使用static修饰局部变量:
void test() { int a = 1; a++; printf("%d\n", a); } int main() { int i = 0; while (i < 10) {test(); i++; } return 0; }

c语言|C语言static关键字
文章图片

使用static修饰局部变量:
void test() { static int a = 1; a++; printf("%d\n", a); } int main() { int i = 0; while (i < 10) {test(); i++; } return 0; }

c语言|C语言static关键字
文章图片

总结:
  1. 使得局部变量出了自己的范围也不销毁,其实是改变了其生命周期
  2. 但是作用域还是局部的。
修饰全局变量 未使用static修饰全局变量:
test.c文件:
extern int g_val; //声明外部变量,在add.c中定义变量, int main() { printf("%d\n", g_val); return 0; }

add.c文件:
int g_val = 200;

【c语言|C语言static关键字】c语言|C语言static关键字
文章图片

使用static修饰全局变量:
test.c文件:
extern int g_val; //声明外部变量,在add.c中定义变量, int main() { printf("%d\n", g_val); return 0; }

add.c文件:
static int g_val = 200;

运行出错:
c语言|C语言static关键字
文章图片

总结:
  1. 全局变量,本身具有外部链接属性
  2. 如果全局变量在源文件是静态的static,会使得全局变量失去外部链接属性
  3. 变成内部链接属性,只能在本来的.c文件使用
修饰函数 未使用static关键字:
//声明外部符号
test.c文件:
extern Add(int x,int y); int main() { int a = 10; int b = 20; int ret = Add(a, b); printf("%d\n", ret); return 0; }

add.c文件:
int Add(int x, int y) { //int表示函数调用返回int变量 int z = x + y; return z; }

c语言|C语言static关键字
文章图片

使用static关键字:
//声明外部符号
test.c文件:
extern Add(int x,int y); int main() { int a = 10; int b = 20; int ret = Add(a, b); printf("%d\n", ret); return 0; }

add.c文件:
static int Add(int x, int y) { //不能被外部.cpp文件调用 int z = x + y; return z; }

运行出错:
c语言|C语言static关键字
文章图片

总结:
  1. 函数默认具有外部链接属性,但是被static修饰后,
  2. 会使得函数失去外部连接属性,变成内部链接属性
  3. static修饰的函数只能在自己所在的.c文件使用
  4. 不能在其他.c文件使用

    推荐阅读