static关键字的三种用法

news2025/1/11 4:21:39

e1a93823081e307459f300f7929fbd05.png

在C语言中,关键字"static"可以用于不同的上下文,具有不同的作用。以下是"static"在C语言中的主要作用:

1. 静态变量(Static Variables):

在C语言中,使用`static`关键字来声明静态变量是一种常见的用法,它具有以下主要作用:

1. 生存期延长:静态变量的生存期在程序的整个运行期间,而不仅仅是在声明它的函数调用期间。这意味着静态变量会在程序启动时分配内存,并在程序终止时释放内存。这与自动变量(局部变量)不同,后者的生存期仅限于其所在函数的执行期间。

2. 保持状态:静态变量的值在函数调用之间保持不变。每次调用包含静态变量的函数时,该变量的值会保持在上一次调用结束时的状态。这对于需要在多次函数调用之间共享信息的情况非常有用,例如计数器或缓存。

下面是一个示例,演示了静态变量的作用:

#include <stdio.h>




void countCalls() {
    // 静态变量,只初始化一次
    static int count = 0;
    
    count++; // 每次调用递增计数
    printf("Function has been called %d times\n", count);
}


int main() {
    countCalls(); // 输出:Function has been called 1 times
    countCalls(); // 输出:Function has been called 2 times
    countCalls(); // 输出:Function has been called 3 times


    return 0;
}

在上面的示例中,`count`是一个静态变量,它在`countCalls`函数的多次调用之间保持其值,而不会在每次函数调用时被重新初始化。这使得我们能够跟踪函数被调用的次数。

2. 静态函数(Static Functions):

在C语言中,使用`static`关键字来声明静态函数是一种常见的用法,它具有以下主要作用:

1. 作用域限制:静态函数的作用域被限制在声明它的源文件(或编译单元)内部,不能在其他文件中被访问。这有助于确保函数的私有性,防止其他文件中的代码无意或恶意地调用它。

2. 命名空间隔离:静态函数的名称在整个程序中具有唯一性,因为它们只在其源文件内部可见。这减少了命名冲突的风险,因为其他文件中可以有相同名称的函数,而不会导致冲突。

3. 模块封装:静态函数通常用于实现文件范围的辅助功能,以便在同一文件内的多个函数之间共享代码,但不希望其他文件能够访问这些辅助函数。这有助于将相关功能封装在一个文件中,以提高代码的模块化和可维护性。

以下是一个示例,演示了静态函数的作用:

// 文件: mymodule.c
#include <stdio.h>
// 静态函数,只在当前文件内可见
static void helperFunction() {
    printf("This is a helper function\n");
}


void publicFunction() {
    printf("This is a public function\n");
    helperFunction(); // 可以调用静态函数
}
// 文件: main.c
#include "mymodule.c"


int main() {
    publicFunction(); // 可以调用公共函数
    // helperFunction(); // 编译错误,无法访问静态函数
    return 0;
}

在上面的示例中,`helperFunction`是一个静态函数,它只能在`mymodule.c`文件中被访问。其他文件(例如`main.c`)无法访问它,从而确保了它的私有性和模块封装性。

3. 静态全局变量(Static Global Variables):

在C语言中,使用`static`关键字来声明静态全局变量是一种常见的用法,它具有以下主要作用:

1. 作用域限制:静态全局变量的作用域被限制在声明它的源文件(或编译单元)内部,不能在其他文件中被访问。这使得该变量对于文件内的其他函数来说是可见的,但无法在其他文件中访问。这有助于确保全局变量的私有性,防止其他文件无意或恶意地修改它。

2. 数据保持性:静态全局变量在程序的整个运行期间保持其值,而不会像普通全局变量那样被销毁和重建。这使得它适用于需要保持状态的情况,例如跟踪应用程序的配置设置、日志级别等信息。

3. 命名空间隔离:静态全局变量的名称在整个程序中具有唯一性,因为它们只在其源文件内部可见。这减少了全局命名冲突的风险,因为其他文件可以有相同名称的全局变量,而不会导致冲突。

以下是一个示例,演示了静态全局变量的作用:

// 文件: mymodule.c
#include <stdio.h>


// 静态全局变量,只在当前文件内可见
static int moduleVar = 42;


void modifyModuleVar(int value) {
    moduleVar = value;
}


void printModuleVar() {
    printf("moduleVar: %d\n", moduleVar);
}
// 文件: main.c
#include "mymodule.c"


int main() {
    printModuleVar(); // 输出:moduleVar: 42
    modifyModuleVar(100);
    printModuleVar(); // 输出:moduleVar: 100


    // moduleVar = 200; // 编译错误,无法访问静态全局变量
    return 0;
}

在上面的示例中,`moduleVar`是一个静态全局变量,它只能在`mymodule.c`文件中被访问。其他文件(例如`main.c`)无法访问它,从而确保了它的私有性和模块封装性。

==========

往期回顾:

单片机程序无法下载?

STM32外部中断大问题

单片机卡死的八大原因和解决方法

判断高电平,低电平和方波的几种方法

==========

16056bea82b97afe2bce30eaff2b4a08.png

1de548a706bf14438bea1af8d99c4df7.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1191026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

module ‘torch‘ has no attribute ‘_six‘

主要问题是torchvision的问题 在122服务器上的scvi-env2环境中 import torch import torch.nn as nnimport numpy as npfrom tqdm import tqdm from torchvision.utils import save_image, make_grid # Model Hyperparametersdataset_path ./datasetscuda True DEVICE tor…

18. 深度学习 - 从零理解神经网络

文章目录 本文目标预测趋势与关系波士顿房价预测 Hi, 你好。我是茶桁。 我们终于又开启新的篇章了&#xff0c;从今天这节课开始&#xff0c;我们会花几节课来理解一下深度学习的相关知识&#xff0c;了解神经网络&#xff0c;多层神经网络相关知识。并且&#xff0c;我们会尝…

vscode 访问本地或者远程docker环境

1、vscode 访问docker本地环境 直接点击左下角连接图标&#xff0c;弹出选项可以选择容器&#xff0c;只要容器在本地运行者&#xff0c;选择attach可以看到运行中的容器可以选择&#xff0c;选择其中需要选择的就行 ## 运行容器&#xff0c;可以-d后台运行都可以 docker run…

【Linux笔记】Linux环境变量与地址空间

【Linux笔记】Linux环境变量与地址空间 一、命令行参数1.1、main函数的参数1.2、main函数的第三个参数 二、环境变量的概念与内容2.1、环境变量的概念2.2、环境变量的分类2.3、环境变量的组织形式2.4、常见的环境变量 三、设置环境变量3.1、通过命令获取或设置环境变量3.2、通过…

开发一条公链多少钱

随着区块链技术的普及和发展&#xff0c;越来越多的企业和个人开始关注公链的开发和建设。那么&#xff0c;开发一条公链到底需要多少钱呢&#xff1f; 首先&#xff0c;我们需要了解公链开发的基本流程和成本构成。一般来说&#xff0c;开发一条公链需要考虑以下几个方面&…

leaflet:个性化配置,利用Leaflet-Geoman绘制多种图形(136)

第136个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中个性化配置,利用Leaflet-Geoman绘制多种图形。 灵活地配置Leaflet-Geoman的属性,可以产生各种美妙的绘图效果。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方…

探索人工智能领域——30个名词详解

目录 前言 正文 总结​​​​​​​ &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请…

已解决:KeyError: ‘The truth value of a Series is ambiguous‘ 问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

ros自定义消息包无法编译生成.h文件的问题解决

ros自定义消息包无法编译生成.h文件的问题解决 想要创建一个ROS功能包专门存放自己自定义的消息&#xff0c;想将这些消息都生成.h&#xff0c;可以由别的功能包来调用。 但是参照网上的诸多帖子未能解决&#xff0c;例如 https://blog.csdn.net/feidaji/article/details/10360…

干货 | 高效联动,携程机票IVR可视化的探索和实践

作者简介 Michael&#xff0c;携程全栈开发专家&#xff0c;追求以技术手段解决业务上的共性问题&#xff0c;构建灵活可配置且可视化的系统&#xff0c;提高生产力&#xff0c;降低沟通成本。 CunShun&#xff0c;携程后端开发工程师&#xff0c;专注系统架构、稳定性、低代码…

【面试经典150 | 】颠倒二进制位

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;逐位颠倒方法二&#xff1a;分治 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…

狮子鱼社区团购小程序V18.9全开源独立版+小程序前端 安装教程

狮子鱼社区团购商城系统小程序V18.9独立开源版&#xff0c;该系统一直开源本身也非常完善&#xff0c;此系统拿来即用非常方便&#xff0c;同上一版一样播播资源特别优化很多细节首页美化了下&#xff0c;如小程序端授权窗口美化了下&#xff0c;该版本用户授权接口正常。功能测…

已解决:Python Error: IndentationError: expected an indented block 问题

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

API低代码开发应用场景

什么是API低代码开发平台 API低代码开发平台是一种基于低代码开发的技术平台&#xff0c;它可以帮助企业快速构建和部署API应用程序。该平台通过提供可视化的开发工具、预定义的组件和模板、自动化的代码生成等功能&#xff0c;使得开发者可以在不需要编写大量代码的情况下&am…

数据结构之单链表基本操作

&#x1f937;‍♀️&#x1f937;‍♀️&#x1f937;‍♀️ 今天给大家分享的是单链表的基本操作。 清风的个人主页 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位…

公众号标签

公众号标签 本章节&#xff0c;讲解公众号标签的相关内容&#xff0c;支持对标签进行创建、查询、修改、删除等操作&#xff0c;也可以对用户进行打标签、取消标签等操作&#xff0c;对应 《微信公众号官方文档 —— 用户标签管理》 (opens new window)文档。 #1. 表结构 公众…

ubuntu 火焰图脚本

环境ubuntu1804 x86_64 #!/bin/bash if [ "$2_" "_" ];thenecho "usage ./fire.sh oncpu/offcpu pid"exit fiif [ "$1_" "oncpu_" ];thensudo perf record -F 99 -p $2 -g -- sleep 10syncsudo perf script > out.pe…

openai自定义API操作 API 返回值说明

custom-自定义API操作 openai.custom 公共参数 名称类型必须描述keyString是调用key&#xff08;获取测试key&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheStrin…

python爬虫hook定位技巧、反调试技巧、常用辅助工具

一、浏览器调试面板介绍 二、hook定位、反调试 Hook 是一种钩子技术&#xff0c;在系统没有调用函数之前&#xff0c;钩子程序就先得到控制权&#xff0c;这时钩子函数既可以加工处理&#xff08;改变&#xff09;该函数的执行行为&#xff0c;也可以强制结束消息的传递。简单…

Vue23-props配置功能

Vue2&3-props配置功能 Vue2-props配置 功能&#xff1a;接收从其他组件传过来的数据&#xff0c;将数据从静态转为动态注意&#xff1a; 同一层组件不能使用props&#xff0c;必须是父组件传子组件的形式。父组件传数据&#xff0c;子组件接收数据。不能什么数据都接收&a…