前言
关于static关键字的使用,在大学期间并没有多少接触,后来才发现这货是真好用!
下面是我对static关键字在C语言中使用的一些总结,仅供参考。吾非大神,若有错漏之处,还请多多指点,大家一起交流学习。
正文
1. 变量
1.1 局部变量(函数体内)
局部变量定义在函数体内部
普通局部变量 是在任意一个函数内部定义的变量,这种变量不加static关键字,未赋初值时它的初值是不确定的,除非对它进行显式赋值,并且每次运行这个函数,这个局部变量都会被重新初始化。
静态局部变量 也是在任意一个函数内部定义的变量,需要加static关键字定义,未赋初值时的静态局部变量编译器会默认初始化为0,当再次运行该函数时,变量的值保持运行结果不变,不会被重新初始化。
程序演示:
#include <stdio.h>
void test(void)
{
int n = 0;
printf("n = %d\n", n);
n++;
printf("n++ = %d\n", n);
}
void test_static(void)
{
static int n = 0;
printf("static n = %d\n", n);
n++;
printf("static n++ = %d\n", n);
}
int main()
{
test();
test_static();
printf("-------------------------\n");
test();
test_static();
return 0;
}
运行结果:
n = 0
n++ = 1
static n = 0
static n++ = 1
-------------------------
n = 0
n++ = 1
static n = 1
static n++ = 2
1.2 全局变量(函数体外)
全局变量定义在函数体的外部
普通全局变量 对整个工程可见,其他文件若要直接使用可用extern关键字进行声明。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。
静态全局变量 仅对当前文件可见, 其他文件不可访问该变量,因此其他文件可以定义与之同名的变量,二者不会冲突。
因此,在程序中定义变量加上static关键字,可以有效的降低同一工程不同文件之间的耦合,避免不同文件同名变量的冲突。
2. 函数
非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明
static在函数上的使用与全局变量类似,在函数的返回值类型前加上static,就是静态函数。
静态函数 特性如下:
- 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
- 不同的文件可以使用相同名字的静态函数,互不影响
/* file1.c */
#include <stdio.h>
static void fun1(void)
{
printf("hello from static fun1.\n");
}
int main(void)
{
fun1();
fun2();
return 0;
}
/* file2.c */
#include <stdio.h>
static void fun2(void)
{
printf("hello from static fun2.\n");
}
使用gcc file1.c file2.c
编译时,错误报告如下:
/tmp/cc2VMzGR.o:在函数‘main’中:
static_fun.c:(.text+0x20):对‘fun2’未定义的引用
collect2: error: ld returned 1 exit status
修改文件,去掉static修饰符,函数可在另一文件中引用:
/* file1.c */
#include <stdio.h>
void fun1(void)
{
printf("hello from static fun1.\n");
}
int main(void)
{
fun1();
fun2();
return 0;
}
/* file2.c */
#include <stdio.h>
void fun2(void)
{
printf("hello from static fun2.\n");
}
运行结果如下:
hello from static fun1.
hello from static fun2.