一、static的使用
主要是身体擦
在C语言中,static关键字可以用于修饰全局变量 和局部变量,但其作用不同。以下是详细的说明和示例:
1. static修饰全局变量
当static用于修饰全局变量时,它会限制该变量的作用域,使其仅在定义它的源文件内可见。其他源文件无法访问该变量。
特点:
-
作用域:仅限于定义它的源文件(文件作用域)。
-
生命周期:与程序的生命周期相同(静态存储期)。
-
链接性 :内部链接(internal linkage),其他文件无法通过
extern声明访问。
示例:
c
复制
// file1.c
#include <stdio.h>
static int globalVar = 10; // 静态全局变量,仅在file1.c中可见
void printGlobalVar() {
printf("GlobalVar: %d\n", globalVar);
}
// file2.c
extern int globalVar; // 错误:无法访问file1.c中的static全局变量
int main() {
printGlobalVar(); // 输出: GlobalVar: 10
return 0;
}
2. static修饰局部变量
当static用于修饰局部变量时,它会改变该变量的存储期 (生命周期),使其从自动存储期(函数调用结束后销毁)变为静态存储期(程序运行期间一直存在)。此外,static局部变量只会被初始化一次。
特点:
-
作用域:仅限于定义它的函数或代码块(局部作用域)。
-
生命周期:与程序的生命周期相同(静态存储期)。
-
初始化:只初始化一次,后续函数调用会保留上一次的值。
示例:
c
复制
#include <stdio.h>
void func() {
static int count = 0; // 静态局部变量
count++;
printf("Count: %d\n", count);
}
int main() {
func(); // 输出: Count: 1
func(); // 输出: Count: 2
func(); // 输出: Count: 3
return 0;
}
3. static修饰全局变量和局部变量的对比
| 特性 | static全局变量 |
static局部变量 |
|---|---|---|
| 作用域 | 仅限于定义它的源文件(文件作用域) | 仅限于定义它的函数或代码块(局部作用域) |
| 生命周期 | 整个程序运行期间(静态存储期) | 整个程序运行期间(静态存储期) |
| 初始化 | 在程序启动时初始化一次 | 在第一次调用时初始化一次,后续调用保留值 |
| 链接性 | 内部链接(其他文件无法访问) | 无链接性(仅限于函数内部) |
| 典型用途 | 隐藏全局变量,避免命名冲突 | 在函数调用之间保留状态 |
4. 总结
-
static全局变量:用于限制全局变量的作用域,避免其他文件访问,增强模块化。 -
static局部变量:用于在函数调用之间保留状态,延长局部变量的生命周期。
2、extern的使用
使用extern声明变量
当你有一个全局变量定义在一个文件中,并希望在另一个文件中访问它时,你可以使用extern来声明它。
示例
假设你有两个文件:file1.c 和 file2.c。
file1.c
c复制代码
|---|----------------------------------------------------------|
| | #include <stdio.h> |
| | |
| | // 定义全局变量 |
| | int globalVar = 10; |
| | |
| | void printGlobalVar() { |
| | printf("Global variable in file1.c: %d\n", globalVar); |
| | } |
file2.c
c复制代码
|---|-----------------------------------------------------------------------------|
| | #include <stdio.h> |
| | |
| | // 声明全局变量(使用extern) |
| | extern int globalVar; |
| | |
| | void modifyGlobalVar() { |
| | globalVar = 20; |
| | } |
| | |
| | int main() { |
| | printGlobalVar(); // 调用file1.c中的函数 |
| | modifyGlobalVar(); |
| | printf("Global variable in file2.c after modification: %d\n", globalVar); |
| | return 0; |
| | } |
在这个例子中,file1.c 定义了一个全局变量 globalVar 和一个函数 printGlobalVar。file2.c 使用 extern 声明了 globalVar,这样它就可以访问和修改这个变量。