在C语言中,static
是一个关键字,用于限定变量、函数和数据的作用域。static
关键字有以下几种常见的用法:
- 静态局部变量(Static Local Variables):在函数内部声明的变量可以被标记为静态局部变量。与普通局部变量不同的是,静态局部变量只会被初始化一次,并且在整个程序的执行过程中保持其值不变。它们在函数调用之间保留着上一次调用的值。
void foo() {
static int counter = 0; // 静态局部变量
counter++;
printf("Counter: %d\n", counter);
}
int main() {
foo(); // 输出:Counter: 1
foo(); // 输出:Counter: 2
return 0;
}
- 静态全局变量(Static Global Variables):在函数外部或文件的顶层声明的变量可以被标记为静态全局变量。静态全局变量只能在声明它的源文件中访问,其他文件无法访问。它们具有文件作用域,但不具备链接性。
// File1.c
#include <stdio.h>
static int counter = 0; // 静态全局变量
void foo() {
counter++;
printf("Counter: %d\n", counter);
}
// File2.c
void bar() {
extern int counter; // 无法访问静态全局变量
printf("Counter: %d\n", counter); // 错误:未声明的标识符
}
- 静态函数(Static Functions):在函数声明或定义前加上
static
关键字可以将函数标记为静态函数。静态函数只能在声明或定义它的源文件中访问,其他文件无法访问。
// File1.c
#include <stdio.h>
static void foo() { // 静态函数
printf("Hello from static function!\n");
}
// File2.c
void bar() {
extern void foo(); // 无法访问静态函数
foo(); // 错误:未声明的标识符
}
- 静态数据成员(Static Data Members):在C++中,类的静态数据成员是所有对象共享的成员变量。而在C语言中,没有类的概念,所以没有静态数据成员的概念。
总之,static
关键字用于限定变量、函数和数据的作用域,并且具有保持状态和隐藏实现细节的效果。