当前位置: 首页 > article >正文

static全局/局部变量/函数和普通全局/局部变量/函数的区别

逐一介绍每种类型的变量和函数在 C 语言中的区别,并通过代码示例说明 static 关键字的作用。

1. static 全局变量与普通全局变量的区别

  • 普通全局变量:可以在多个 .c 文件中使用(即具有外部链接)。
  • static 全局变量:作用域仅限于声明它的文件内部,其他文件无法访问(即具有内部链接)。

2. static 局部变量与普通局部变量的区别

  • 普通局部变量:每次进入函数时重新创建,退出函数时销毁,因此它不保留上次的值。
  • static 局部变量:在函数内定义但具有静态存储期,函数多次调用时不会被重新创建,会保留上次的值。

3. static 函数与普通函数的区别

  • 普通函数:可以在多个 .c 文件中使用(外部链接)。
  • static 函数:作用域仅限于声明它的文件内部,其他文件无法调用该函数(内部链接)。

示例代码

示例结构

假设我们有三个文件:

  1. file1.c — 包含普通和 static 全局变量、函数和局部变量。
  2. file2.c — 尝试访问 file1.c 中的变量和函数。
  3. 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

解释

  1. static 全局变量与普通全局变量的区别

    • globalVar 是普通全局变量,可以在 file2.c 中访问。
    • staticGlobalVar 是静态全局变量,只能在 file1.c 中使用,尝试在 file2.c 中访问会报错。
  2. static 局部变量与普通局部变量的区别

    • testStaticAndLocalVars() 函数中,localVar 是普通局部变量,每次调用时都会重新初始化为 1
    • staticLocalVar 是静态局部变量,第一次初始化为 1,在函数多次调用时会保留其值,因此第二次调用时值增加到 3
  3. static 函数与普通函数的区别

    • normalFunction 是普通函数,可以在 file2.c 中调用。
    • staticFunction 是静态函数,只能在 file1.c 中使用,尝试在 file2.c 中调用会报错。

总结

  • static 全局变量:仅在定义它的文件中可见,防止其他文件意外使用该变量。
  • static 局部变量:在函数内声明,但在多次调用间保留其值。
  • static 函数:作用域仅限于声明它的文件中,防止其他文件调用它。

http://www.kler.cn/a/376001.html

相关文章:

  • TVM前端研究--Pass
  • java并发编程-CAS详解
  • Linux内核与用户空间
  • 2021-10-28 51蛋骗鸡独立按键控制LED和蜂鸣器
  • 抽丝剥茧 分布式服务框架设计 理论设计篇
  • <HarmonyOS第一课>应用/元服务上架的课后习题
  • 数据结构初识及顺序表详解
  • Mysql 8.4.3LTS 的离线部署
  • vue中时间插件moment
  • Java中的JVM(Java虚拟机)是什么?
  • 【OD-支持在线评测】电脑病毒感染(200分)
  • Android版本适配策略
  • 模式匹配类型
  • 使用AWS Redshift从AWS MSK中读取数据
  • Dropout 技术:防止神经网络过拟合的有效手段
  • 20241029软考架构-------软考案例9答案
  • AI 大模型的发展趋势是怎样的?
  • 量子神经网络(Quantum Neural Network):结合量子计算的 AI 新探索
  • cv.dnn.blobFromImage参数详解
  • Unity项目使用的.net版本
  • 【网络】HTTP(超文本传输协议)详解
  • Java面试题十五
  • 基于大数据的智能家居销量数据分析
  • 基于OSS搭建在线教育视频课程分享网站
  • 提升效率:中小企业常用的8款任务管理工具
  • 官方源码,LVDS中判断数据是否对齐时钟上升沿的方法解析