static关键字的三种用法

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java算法(五):手写数组逆置API方法,实现数组逆置。 while实现 for循环实现

Java算法&#xff08;五&#xff09; while 循环实现 需求&#xff1a; 已知一个数组&#xff0c;arr {11, 22, 33, 44, 55};使用程序实现把数组中的元素交换位置。 交换后的数组为 arr {55, 44, 33, 22, 11}; 并在控制台输出交换后的数组元素。 代码示例 package com.…

JS 处理文档选择和范围创建【createRange | getSelection】

介绍 1、const selection window.getSelection(); 说明&#xff1a; 1、用于获取用户当前文档选择的对象&#xff1b; 2、它返回一个 Selection 对象&#xff0c;该对象代表了用户选择的文本范围&#xff08;可以包含一个或多个范围&#xff0c;因为用户可以同时选择多个不相…

YOLO目标检测——红绿灯检测数据集【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;红绿灯检测数据集在自动驾驶、交通安全监控、智能交通系统、交通流量监测和驾驶员辅助系统等领域都有广泛应用的潜力数据集说明&#xff1a;红绿灯检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有国内红绿灯…

Android:OkHttp同步请求和异步请求

一、前言 网络请求之前工作中用到的是post请求&#xff0c;然后了解之后发现请求的种类还有很多种。下面着重讲到是get和post的同步请求和异步请求。 二、具体内容 1.Okhttp的特点&#xff1a; 支持Http/2并允许对同一主机的所有请求共享一套接字&#xff1b;如果非HTTP/2&…

运维相关(一) - Vue项目配置WebSocket连接{ws、wss 连接方式}

Vue项目配置WebSocket连接 ws、wss 两种方式 1. 写作背景2. 晒出代码2.1 前端 vue.config.js 的代码2.2 Vue项目路由配置代码3.3 服务器Nginx配置 3. 使用方式3.1 前端代码3.2 后端代码 4. 测试使用 1. 写作背景 项目使用的是ruoyi的前后端分离框架项目需要使用到 websocket , …

数据结构与算法—双链表

前言 前面有很详细的讲过线性表(顺序表和链表)&#xff0c;当时讲的链表以单链表为主&#xff0c;但在实际应用中双链表有很多应用场景&#xff0c;例如大家熟知的LinkedList。 双链表与单链表区别 单链表和双链表都是线性表的链式实现&#xff0c;它们的主要区别在于节点结构…

lua 时间差功能概略

简介 在进行程序设计过程中&#xff0c;经常需要对某些函数、某些程序片断从开始运行到运行结束所耗费的时间进行一些量化。这种量化实际上就是计算时间差。 获取函数耗时情景如下&#xff1a; function time_used() --开始计时-- do something at here. --结束计时--时间差&…

交易所开发搭建

在当今的数字货币市场中&#xff0c;交易所开发搭建已经成为了一个重要的领域。交易所是数字货币交易的主要场所&#xff0c;为投资者提供了安全、可靠、高效的交易服本务文。将详细介绍交易所开发搭建的整个流程&#xff0c;包括需求分析、设计、技术选型、开发、测试和上线等…

【2】Spring Boot 3 项目搭建

目录 【2】Spring Boot 3 初始项目搭建项目生成1. 使用IDEA商业版创建2. 使用官方start脚手架创建 配置与启动Git版本控制 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; 【2】Spring Boot 3 初始项目搭建 项目生成 1. 使用IDEA商业版创…

【Element】隐藏 el-table 展开行的箭头

需求 点击行展开行&#xff0c;隐藏箭头 方法 首先需求是点击行显示展开行 row-click"rowClick"const rowClick (row: any, column: any, event: any) > {console.log(row, column, event)if (multipleTable.value) {multipleTable.value.toggleRowExpansio…

PostgreSQL 技术内幕(十一)位图扫描

扫描算子在上层计算和底层存储之间&#xff0c;向下扫描底层存储的数据&#xff0c;向上作为计算的输入源&#xff0c;在SQL的执行层中&#xff0c;起着关键的作用。顺序、索引、位图等不同类型的扫描算子适配不同的数据分布场景。然而&#xff0c;扫描算子背后的实现原理是怎样…

投资自己,成就未来——人大女王金融硕士助力您成为金融领域的佼佼者

在这个日新月异的时代&#xff0c;金融行业的发展日益繁荣&#xff0c;对于金融人才的需求也越来越大。为了应对这一挑战&#xff0c;越来越多的人选择投身金融领域&#xff0c;提升自己的专业素养。而中国人民大学女王金融硕士项目&#xff0c;正是为了满足这一需求而设立的&a…

JVM在线分析-解决问题的工具一(jinfo,jmap,jstack)

1. jinfo (base) PS C:\Users\zishi\Desktop> jinfo Usage:jinfo <option> <pid>(to connect to a running process)where <option> is one of:-flag <name> to print the value of the named VM flag #输出对应名称的参数-flag [|-]<n…

Pandas数据预处理Pandas合并数据集在线闯关_头歌实践教学平台

Pandas数据预处理合并数据集 第1关 Concat与Append操作第2关 合并与连接第3关 案例&#xff1a;美国各州的统计数据 第1关 Concat与Append操作 任务描述 本关任务&#xff1a;使用read_csv()读取两个csv文件中的数据&#xff0c;将两个数据集合并&#xff0c;将索引设为Ladder…

element ui:常用的组件使用情况记录

前言 将element ui使用过程中一些常用的组件使用情况记录如下 组件 el-tree树组件 树父子节点成一列显示 没有进行设置之前显示效果 设置之后显示效果 ​​​​ 主要代码如下 <el-treeicon-class"none"expand-on-click-node"false"style"…

震裕科技-300953 三季报分析(20231108)

震裕科技-300953 基本情况 公司名称&#xff1a;宁波震裕科技股份有限公司 A股简称&#xff1a;震裕科技 成立日期&#xff1a;1994-10-18 上市日期&#xff1a;2021-03-18 所属行业&#xff1a;专用设备制造业 周期性&#xff1a;0 主营业务&#xff1a;精密级进冲压模具及下游…

Word通过Adobe打印PDF时总是报错,打开记事本

Word文档打印&#xff0c;选择Adobe作为打印机&#xff0c;打印过程中总是报错&#xff0c;不断打开记事本&#xff0c;提示打印出错&#xff0c;错误信息如下&#xff1a; %%[ ProductName: Distiller ]%% %%[Page: 1]%% %%[Page: 2]%% %%[ Error: invalidfont; OffendingCom…

Scala中编写多线程爬虫程序并做可视化处理

在Scala中编写一个爬虫程序来爬取店铺商品并进行可视化处理&#xff0c;需要使用Selenium和Jsoup库来操作网页。在这个例子中&#xff0c;我们将使用多线程来提高爬取速度。 1、首先&#xff0c;我们需要引入所需的库&#xff1a; import org.openqa.selenium.By import org.o…

【Unity之UI编程】在Unity中如何打图集,来降低DrowCall

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;UI_…