在C语言中,static有以下几种用法:
1. 修饰变量:被static修饰的全局变量具有静态存储期,即从定义开始到程序结束都存在,但作用域仅限于当前文件(即不能被其他文件访问),可以避免不同文件中同名变量的命名冲突。被static修饰的局部变量具有静态生存期,即变量一直存在,而不是随着函数的调用结束而销毁,但作用域仅限于当前代码块。
//static关键字修饰全局变量
#include <stdio.h>
static int count = 0; //定义静态变量
void increment()
{
++count;
printf("count is %d\n", count);
}
//file2.c
#include <stdio.h>
extern void increment(); //声明increment函数
int main()
{
increment(); //输出count is 1
increment(); //输出count is 2
increment(); //输出count is 3
return 0;
}
在该例子中,我们定义了一个静态变量count
,该变量只能在file1.c
文件内使用,无法在其他文件中访问。每次调用increment()
函数时,count
的值会自增并打印输出。
//static关键字修饰局部变量
#include <stdio.h>
int main()
{
for (int i = 0; i < 3; i++)
{
static int j = 0;
j++;
printf("i = %d, j = %d\n", i, j);
}
return 0;
}
在该例子中,我们定义了一个静态变量j
,在每次循环时j
的值会累加,并打印输出。由于j
被定义为静态变量,所以其生命周期会持续到程序退出,每次循环都使用相同的变量j
,而不是像非静态变量一样每次都创建一个新对象。
2. 修饰函数:被static修饰的函数具有静态链接属性,即只能在定义它的文件中访问。静态函数不会被其他文件所用,也就是它只能被本文件中的函数调用。
#include <stdio.h>
static void print()
{
printf("Hello, World!\n");
}
//file2.c
#include <stdio.h>
extern void print(); //声明print函数
int main()
{
print(); //这里可以访问print函数
return 0;
}
3. 静态断言:是一个编译错误,用于在编译期间检查某个条件是否为真。
总之,在C语言中,static主要用于控制变量和函数的作用域和链接属性。