C语言中常见关键字(static,extern)
一、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
,这样它就可以访问和修改这个变量。