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 声明全局变量的区别

  1. extern

  • 当你在一个源文件中使用 extern 关键字来声明一个全局变量时,它表示该变量是在其他源文件中定义的,而不是在当前文件中定义的。

  • 它用于引用其他文件中定义的全局变量,使得这个全局变量在当前文件中可见。

  • 通过 extern 声明的全局变量只是引用,不分配内存空间。实际的内存分配发生在定义该全局变量的文件中。

// File1.c
int globalVar = 42;

// File2.c
extern int globalVar; // 声明在另一个文件中定义的全局变量
  1. 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:

keyword-extern.c
int eg1 = 2; //定义全局变量 eg1
basic-function.c
// 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;
//}
4.6.1 extern-func.c
//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