代码快递员:extern如何送达静态变量至各文件目的地

各位少年,大家好,我是博主那一脸阳光

在这里插入图片描述

前言:话说有一天,静态变量先生和extern女士一起去参加编程界的武林大会。静态变量先生自豪地说:“你知道我为什么这么受欢迎吗?因为我可是个低调的富翁,我在函数内部藏着金元宝(持久化存储),谁也别想偷走我的财富。”

extern女士听后掩嘴一笑:“那是因为你不知道怎么理财投资,看看我,轻轻一挥我的仙女棒(extern声明),就把你的财富带到全世界的各个角落,让所有人都能看到你的名号!”
meiy
就这样,静态变量先生明白了,原来真正的富翁不仅要懂得积累,还要学会分享和交流。从此以后,他们联手开创了代码江湖中一段段流传千古的佳话……

v
假设左边文件名称add.c,右边叫做test.c,左边是全局变量,我们知道全局变量作用域是程序结束,但是这是多条文件,所以这里介绍一个关键字 extern

extern 数据类型 变量名
#include<stdio.h>
extern int g_val
int main()
{printf("%d\n", g_val);return 0;
}
int g_val = 2029;

这里的extern可以想象成一个接口,extern让大家原本没有链接属性的多个文件,变得有所链接,这本段代码中exturn声明了,g
_val的全局变量,而不是创建,所以在test。c这个文件里可以直接使用,接下来推荐几个使用exturn措施。

extern不可以声明被static修饰的静态变量
extern在声明的文件中的内容与其他文件保持一致
extern可以声明函数和函数参数,但内容必须和写函数和函数参数的文件保持一致,否则无法使用

大家可能不理解,这三条语法定义的规则,我们通过代码,演示一下。

static int Add(int x,int y)
{
return x+y
}
```sc.c
#include<stdio.h>
exturn int Add(int x,int y);
int main()
{
int a=10;
int b=20;
int c=Add(a,b);
printf("%d\n",c);
return 0;
}
test.c

这段代码会报错,因为exturn无法声明static修饰的变量,大家通过上面的代码理解了,我说的三条建议性的语句。
接下来介绍三条static语句的使用规则
static修饰全局变量:
1.首先要知道全局变量是具有外部链接数学的
2.全局变量被static修饰后,外部链接属性就变成内部链接属性,就是这个全局变量,只能在自己所在的.c文件中使用,其他文件看不到。
相当于作用域变小了。

static修饰函数
1函数也是具有外部链接属性
2但是被static修饰后,外部链接属性就变成内部链接属性,这个函数只能在自己所在的.C文件中使用
其他文件中及时声明了,也不能使用。

总结
在编程的江湖中,static与extern无疑是两位举足轻重的侠客,他们各自拥有独特武艺,又默契配合,共同维护着代码世界的秩序。

static大侠深藏不露,身怀绝技。对于局部变量,他赋予其持久生命力,让它们在函数多次调用间延续记忆;而对于全局变量,他又巧妙地施加隐身术,令它们仅在当前编译单元内享有盛誉,避免了外界的干扰和纷争。静态函数亦是他的一大拿手好戏,它们悄然坚守岗位,只为局部领域提供服务,减少了全局命名空间的拥挤。

而extern女侠,则是跨文件交流的信使,她擅长编织一张无形的网络,将各编译单元中的全局变量紧紧相连。通过她的引荐,全局变量得以冲破束缚,跨越疆界,成为各大模块间信息传递的重要纽带。同时,她也不忘提携函数,让它们在不同的源文件中声名远播,为项目的整体协调和运作提供了强大支持。

总的来说,static和extern两位大侠在C语言的广阔天地中各显神通,相辅相成,共同成就了代码模块化、结构化和高效化的发展。作为开发者,我们应当善用这两大利器,精雕细琢每一行代码,打造出既稳定可靠又便于维护的优质项目。愿我们在编程的道路上,随这两者一同探寻更深层次的奥秘,书写出更多精彩的程序篇章。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态编译 - Dynamically Compile and Load External Java Classes

文章目录 概述Code 概述 动态编译和加载外部Java类的核心流程可以概括为以下几个步骤&#xff1a; 读取源代码: 首先&#xff0c;需要获取到外部的Java源代码。这通常是通过读取文件、网络资源或者数据库中的源代码字符串来实现的。编译源代码: 接下来&#xff0c;需要使用Ja…

html5实现好看的个人博客模板源码

文章目录 1.设计来源1.1 主界面1.2 认识我界面1.3 我的文章界面1.4 我的模板界面1.5 文章内容界面 2.结构和源码2.1 目录结构2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/135368653 html5实现好看…

物联网的感知层、网络层与应用层分享

物联网的概念在很早以前就已经被提出&#xff0c;20世纪末期在美国召开的移动计算和网络国际会议就已经提出了物联网(Internet of Things)这个概念。 最先提出这个概念的是MIT Auto-ID中心的Ashton教授&#xff0c;他在研究RFID技术时&#xff0c;便提出了结合物品编码、互联网…

【论文解读】基于神经辐射场NeRF的像素级交互式编辑(Seal-3D)

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2307.15131 项目主页&#xff1a;https://windingwind.github.io/seal-3d/ 摘要&#xff1a; 随着隐式神经表征或神经辐射场&#xff08;NeRF&#xff09;的普及…

针对人工智能的攻击并发布策略和建议

人工智能系统已经渗透到现代社会的各个领域。从自动驾驶到疾病诊断以及作为在线聊天机器人与客户互动。 为了学习如何执行这些任务&#xff0c;聊天机器人需要接受大量数据的训练。然而&#xff0c;主要问题之一是这些数据可能不可靠。攻击者有很多机会破坏它们。这都是在AI系…

docker、docker-compose 离线安装、shell脚本一键安装、卸载

注&#xff1a;二进制包&#xff0c;与脚本在同级目录 docker 离线安装&#xff1a; 包下载&#xff1a;https://download.docker.com/linux/static/stable/x86_64/ docker_install.sh&#xff1a; #!/bin/bash# 指定 Docker 版本和文件名 DOCKER_VERSION"24.0.7" D…

【影刀RPA_如何使用影刀的企业微信指令?】

思路&#xff1a;先用python代码过一遍&#xff0c;再将必要参数填到指令里面。 第一步&#xff1a; 1、在企业微信后台新建应用&#xff0c;设置消息接收地址&#xff08;需要服务器的公网ip地址&#xff09;&#xff0c;进行签名验证。然后&#xff0c;从浏览器中查询ip地址…

C语言基础知识(5):TCP网络编程

TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构&#xff0c;当应用程序采用 TCP 发送消息时&#xff0c;虽然可以保证发送的顺序&#xff0c;但还是犹如没有任何间隔的数据流发送给接收端。TCP 为提供可靠性传输&#xff0c;实行“顺序控制”或“重发控制”机制。此…

Redis 持久化——AOF

文章目录 为什么需要AOF?概念持久化查询和设置1. 查询AOF启动状态2. 开启AOF持久化2.1 命令行启动AOF2.2 配置文件启动 AOF 3. 触发持久化3.1 自动触发3.3 手动触发 4. AOF 文件重写4.1 什么是AOF重写&#xff1f;4.2 AOF 重写实现4.3 AOF 重写流程 5. 配置说明6. 数据恢复6.1…

【SpringCloud】之远程消费(进阶使用)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之远程消费》。&#x1f3af;&a…

H266/VVC多样化视频编码工具概述

全景视频编码 全景视频&#xff1a; 具有360度全包围视角的球面视频。 全景视频编码&#xff1a; 包括H266在内的视频编码算法都是以平面视频为对象的&#xff0c;为了采用传统的视频编码编码算法&#xff0c;全景视频需要转换为平面视频&#xff0c;其中经纬图等角映射&#…

dubbo的基础知识

dubbo是什么 Dubbo是一个分布式服务框架&#xff0c;是一种高性能的远程通讯框架。它提供了基于Java的RPC&#xff08;远程过程调用&#xff09;通信机制&#xff0c;使得应用之间可以方便地进行远程调用&#xff0c;实现分布式服务的调用和管理。Dubbo提供了服务注册、发现、负…

【大数据进阶第三阶段之Hive学习笔记】Hive常用命令和属性配置

目录 1、Hive安装 2、HiveJDBC访问 2.1、启动hiveserver2服务 2.2、连接hiveserver2服务 2.3、注意 3、Hive常用交互命令 3.1、“-e”不进入hive的交互窗口执行sql语句 3.2、“-f”执行脚本中sql语句 4、Hive其他命令操作 4.1、退出hive窗口 4.2、在hive cli命令窗口…

基于OpenCV的透视变换

基础概念 透视变换(Perspective Transformation)是仿射变换的一种非线性扩展,是将图片投影到一个新的视平面(Viewing Plane)&#xff0c;也称作投影映射(Projective Mapping)。 原理&#xff1a;将二维的图片投影到一个三维视平面上&#xff0c;然后再转换到二维坐标下&#…

LeetCode 2807.在链表中插入最大公约数

【LetMeFly】2807.在链表中插入最大公约数 力扣题目链接&#xff1a;https://leetcode.cn/problems/insert-greatest-common-divisors-in-linked-list/ 给你一个链表的头 head &#xff0c;每个结点包含一个整数值。 在相邻结点之间&#xff0c;请你插入一个新的结点&#x…

使用 C# Winfrom编写倒计时功能

在日常生活中&#xff0c;我们经常需要倒计时来提醒自己重要的时间节点&#xff0c;比如倒计时到达一个特定的日期和时间。介绍一个使用 C# 编写的倒计时应用程序的实现。 步骤一&#xff1a;应用程序的功能 它具有以下几个主要特点&#xff1a; 用户输入目标日期和时间&…

CSS3 边框border、outline、box-shadow

1 border 语法&#xff1a;border: width style color 2 outline 语法&#xff1a;outline: width style color 2.1 outline-offet MDN解释&#xff1a;用于设置outline与一个元素边缘或边框之间的间隙 即&#xff1a;设置outline相对border外边缘的偏移&#xff0c;可以为…

excel统计分析——两因素有重复方差分析

参考资料&#xff1a;生物统计学 无重复观测值的两因素方差分析只能研究两个因素的主效应&#xff0c;不能考察因素间的交互作用&#xff0c;只有在确定因素间不存在交互作用时才能进行无重复观测值的试验和分析。为了准确估计因素的主效应、交互作用和随机误差&#xff0c;每个…

DQL命令查询数据 (二)

本课目标 掌握 ORDER BY 子句 使用 LIMIT 子句实现分页查询 掌握MySQL的分组查询 掌握MySQL的子查询 SELECT 语法 ORDER BY 排序 ORDER BY 子句&#xff1a;按照一定顺序显示查询结果 排序可以是升序&#xff08;ASC&#xff09;或者是降序&#xff08;DESC&#xff09;&…

使用C#发送邮箱验证码

使用C#发送邮箱验证码 在很多应用程序中&#xff0c;我们需要使用邮箱来进行用户身份验证。其中一种常见的方式是通过发送验证码到用户的邮箱&#xff0c;然后要求用户输入该验证码进行验证。本文将介绍如何使用 C# 发送邮箱验证码。 声明 验证码登录没有用任何的工具&#…