4.6 静态变量
Static Variables

书中讲解 static 的篇幅很短就半页,讲解了几条 rules 理解起来稍有难度。 本节会从三个部分去讲解 static,这些笔记写于 2023 年 9 月,于 2024 年 1 月 20 日进行整理。
注意:declaration 声明
4.6.1 static 声明局部变量


static 修饰局部变量的时候,局部变量出了作用域不销毁。static 修饰局部变量的时候,实质上是改变了变量的存储位置。

static 的实质是改变存储位置,来影响变量的生命周期。 使用 static 修饰的时候,变量会直接放到静态区,就是在创建的时候就会存到静态区。
static 不会反复执行,a 的位置也不会改变。

上述都看不到,static 的汇编代码。
4.6.2 static 和 extern 声明全局变量的区别
extern
:
当你在一个源文件中使用
extern
关键字来声明一个全局变量时,它表示该变量是在其他源文件中定义的,而不是在当前文件中定义的。它用于引用其他文件中定义的全局变量,使得这个全局变量在当前文件中可见。
通过
extern
声明的全局变量只是引用,不分配内存空间。实际的内存分配发生在定义该全局变量的文件中。
// File1.c
int globalVar = 42;
// File2.c
extern int globalVar; // 声明在另一个文件中定义的全局变量
static
:
当你在一个源文件中使用
static
关键字来声明一个全局变量时,它表示该变量只能在当前文件中访问,其他文件无法访问或引用它。static
全局变量在全局变量区分配内存空间,但其作用域被限制在当前文件内,不会被其他文件看到。
// File1.c
static int globalVar = 42; // 只在当前文件可见
// File2.c 无法访问 globalVar,因为它是 static 的
总结:
extern
用于声明其他文件中定义的全局变量,使其在当前文件可见。static
用于限制全局变量的作用域,使其只在当前文件内可见。
这两者的选择取决于你的需求。如果你需要在多个文件中共享全局变量,使用 extern
来声明它,而在其中一个文件中定义它。如果你想限制全局变量的作用域,使其仅在当前文件内可见,使用 static
。

4.6.3 static 声明函数
static 关键字控制文件内可见性和生命周期。
extern 关键字使对在其他文件中定义的实体的访问成为可能
以下是 extern demo:
int eg1 = 2; //定义全局变量 eg1
// two-number-sum
// #include <stdio.h>
int sum(int a, int b) { //定义一个sum函数 计算两数之和 后面就是把s1的值传给a,s2的值传给b
int c = 0; //初始化c 给c的类型是 int
c = a + b; //这就是在定义加法 计算结果给c存在来
return c; //把c的值传给 sum()
}
//int main() {
// int s1 = 0; //初始化变量
// int s2 = 0;
// scanf("%d %d", &s1, &s2); //输入两个值存起来
//int Res = sum(s1, s2); //求和借助 Res函数 就是结果的意思 s1,s2 就是输入的两个数,sum的实质是相加两个数
// sum()的值就是最终 上述c的值 这时sum()把存的c值,赋值/传给 Res
//printf("%d\n", Res); //输出结果
// return 0;
//}
//keyword-extern.c
extern int eg1;
//basic-function.c
extern int sum(int a, int b);
#include <stdio.h>
int main()
{
printf("%d\n", eg1);
int s1 = 0; //初始化变量
int s2 = 0;
scanf("%d %d", &s1, &s2); //输入两个值存起来
int Res = sum(s1, s2); //求和借助 Res函数 就是结果的意思 s1,s2 就是输入的两个数,sum的实质是相加两个数
// sum()的值就是最终 上述c的值 这时sum()把存的c值,赋值/传给 Res
printf("%d\n", Res); //输出结果
return 0;
}
使用 gcc 命令进行编译:
gcc -c basic-function.c -o basic-function.o
gcc -c keyword-extern.c -o keyword-extern.o
gcc -c 4.6.1-extern-func.c -o 4.6.1-extern-func.o
gcc basic-function.o keyword-extern.o 4.6.1-extern-func.o -o extern-exec

OUT:

Last updated
Was this helpful?