static全局/局部变量/函数和普通全局/局部变量/函数的区别
逐一介绍每种类型的变量和函数在 C 语言中的区别,并通过代码示例说明 static
关键字的作用。
1. static
全局变量与普通全局变量的区别
- 普通全局变量:可以在多个
.c
文件中使用(即具有外部链接)。 static
全局变量:作用域仅限于声明它的文件内部,其他文件无法访问(即具有内部链接)。
2. static
局部变量与普通局部变量的区别
- 普通局部变量:每次进入函数时重新创建,退出函数时销毁,因此它不保留上次的值。
static
局部变量:在函数内定义但具有静态存储期,函数多次调用时不会被重新创建,会保留上次的值。
3. static
函数与普通函数的区别
- 普通函数:可以在多个
.c
文件中使用(外部链接)。 static
函数:作用域仅限于声明它的文件内部,其他文件无法调用该函数(内部链接)。
示例代码
示例结构
假设我们有三个文件:
file1.c
— 包含普通和static
全局变量、函数和局部变量。file2.c
— 尝试访问file1.c
中的变量和函数。main.c
— 用于演示和运行整个代码。
1. file1.c
#include <stdio.h>
int globalVar = 100; // 普通全局变量
static int staticGlobalVar = 200; // static 全局变量
void normalFunction() {
printf("This is a normal function in file1.c\n");
}
static void staticFunction() {
printf("This is a static function in file1.c\n");
}
void testStaticAndLocalVars() {
int localVar = 1; // 普通局部变量
static int staticLocalVar = 1; // static 局部变量
localVar++;
staticLocalVar++;
printf("Local variable: %d, Static local variable: %d\n", localVar, staticLocalVar);
}
2. file2.c
#include <stdio.h>
extern int globalVar; // 声明引用 file1.c 中的普通全局变量
// extern int staticGlobalVar; // 尝试引用 static 全局变量会出错
void normalFunction();
// void staticFunction(); // 尝试引用 static 函数会出错
void accessFromAnotherFile() {
printf("Accessing globalVar from file2.c: %d\n", globalVar);
normalFunction();
// 以下代码会出错,因为 staticGlobalVar 和 staticFunction 都是静态的,仅 file1.c 可见。
// printf("Accessing staticGlobalVar from file2.c: %d\n", staticGlobalVar);
// staticFunction();
}
3. main.c
#include <stdio.h>
void testStaticAndLocalVars();
void accessFromAnotherFile();
int main() {
printf("Testing static and local variables in a function:\n");
testStaticAndLocalVars();
testStaticAndLocalVars(); // 调用两次函数,观察 static 局部变量的效果
printf("\nTesting access to global variables and functions from another file:\n");
accessFromAnotherFile();
return 0;
}
编译和运行
将所有文件一起编译:
gcc file1.c file2.c main.c -o program
./program
预期输出
Testing static and local variables in a function:
Local variable: 2, Static local variable: 2
Local variable: 2, Static local variable: 3
Testing access to global variables and functions from another file:
Accessing globalVar from file2.c: 100
This is a normal function in file1.c
解释
-
static
全局变量与普通全局变量的区别:globalVar
是普通全局变量,可以在file2.c
中访问。staticGlobalVar
是静态全局变量,只能在file1.c
中使用,尝试在file2.c
中访问会报错。
-
static
局部变量与普通局部变量的区别:- 在
testStaticAndLocalVars()
函数中,localVar
是普通局部变量,每次调用时都会重新初始化为1
。 staticLocalVar
是静态局部变量,第一次初始化为1
,在函数多次调用时会保留其值,因此第二次调用时值增加到3
。
- 在
-
static
函数与普通函数的区别:normalFunction
是普通函数,可以在file2.c
中调用。staticFunction
是静态函数,只能在file1.c
中使用,尝试在file2.c
中调用会报错。
总结
static
全局变量:仅在定义它的文件中可见,防止其他文件意外使用该变量。static
局部变量:在函数内声明,但在多次调用间保留其值。static
函数:作用域仅限于声明它的文件中,防止其他文件调用它。