在 C 语言中,`static` 是一个多用途的关键字,用于不同的情况和上下文。下面是一些常见的用法和示例:
**1. 静态变量(Static Variables)**
静态变量是在函数内部或模块(文件)作用域内声明的变量,其生命周期与程序的执行周期相同,而不是每次函数调用时重新初始化。静态变量默认情况下具有内部链接(Internal Linkage),只能在声明它的源文件中访问。
函数内部的静态变量示例:
```c
void foo() {
static int count = 0; // 静态变量
count++;
printf("Count: %d\n", count);
}
int main() {
foo(); // 输出 Count: 1
foo(); // 输出 Count: 2
foo(); // 输出 Count: 3
return 0;
}
```
模块作用域的静态变量示例:
```c
// File1.c
static int globalVar = 10; // 静态变量,只能在当前源文件中访问
// File2.c
extern int globalVar; // 引用其他源文件中的静态变量
int main() {
printf("Global Variable: %d\n", globalVar); // 输出 Global Variable: 10
return 0;
}
```
**2. 静态函数(Static Functions)**
静态函数是在函数或模块作用域内声明的函数,其作用域限定在声明它的源文件中,无法被其他源文件直接调用。静态函数默认具有内部链接(Internal Linkage)。
函数内部的静态函数示例:
```c
void foo() {
static void bar() { // 静态函数
printf("Inside bar()\n");
}
bar();
}
int main() {
foo(); // 输出 Inside bar()
return 0;
}
```
模块作用域的静态函数示例:
```c
// File1.c
static void helper() { // 静态函数,只能在当前源文件中调用
printf("Inside helper()\n");
}
// File1.c 或其他源文件
int main() {
helper(); // 编译错误,无法调用静态函数
return 0;
}
```
**3. 静态全局变量(Static Global Variables)**
静态全局变量是在模块作用域内声明的全局变量,其作用域限定在声明它的源文件中,无法被其他源文件直接访问。静态全局变量默认具有内部链接(Internal Linkage)。
```c
// File1.c
static int globalVar = 10; // 静态全局变量,只能在当前源文件中访问
// File2.c
extern int globalVar; // 引用其他源文件中的静态全局变量
int main() {
printf("Global Variable: %d\n", globalVar); // 输出 Global Variable: 10
return 0;
}
```
**4. 静态常量(Static Constants)**
静态常量是在函数内部、模块作用域内或全局作用域内声明的常量,其值在编译时确定,并在整个程序执行期间保持不变。静态常量默认具有内部链接(Internal Linkage)。
函数内部的静态常量示例:
```c
void foo() {
static const int MAX_VALUE = 100; // 静态常量
printf("Max Value: %d\n", MAX_VALUE);
}
int main() {
foo(); // 输出 Max Value: 100
return 0;
}
```
模块作用域的静态常量示例:
```c
// File1.c
static const double PI = 3.14159; // 静态常量,只能在当前源文件中访问
// File2.c
extern const double PI; // 引用其他源文件中的静态常量
int main() {
printf("PI: %f\n", PI); // 输出 PI: 3.141590
return 0;
}
```
以上是 `static` 关键字在 C 语言中的一些常见用法和示例。它可以用于静态变量、静态函数、静态全局变量和静态常量,提供了限定作用域、具有内部链接和保持共享状态的机制。
请注意,`static` 的具体语义和用法可能会在不同的上下文中有所不同,具体取决于其所应用的位置和语义。