【C语言深度解剖——第二节(关键字2)】《C语言深度解剖》+蛋哥分析+个人理解

今日的星辰辉映太古的源起,过往的故事指引明日的生死!(王者荣耀李信)
本文由@睡觉待开机原创,未经允许不得转载。
本内容在csdn网站首发
欢迎各位点赞—评论—收藏
如果存在不足之处请评论留言,共同进步!

这里写目录标题

  • 前言
  • 1.static关键字修饰全局变量和函数
    • 1.1多文件内容介绍
    • 1.2头文件
    • 1.3static函数+全局变量与函数
  • 2.static关键字修饰局部变量
  • 3.static关键字修饰的意义:

前言

本节内容主要是围绕static关键字来展开的,重点阐述了static创建的意义,由来,使用…

1.static关键字修饰全局变量和函数

在介绍static关键字之前,我们首先来准备一下预备知识,同样这些预备知识也是比较关键的。

1.1多文件内容介绍

在同一个vs项目当中,有许多源文件(后缀为.c文件),其中多文件是指的便是多个.c文件(下图)。
在这里插入图片描述
那我来问大家几个问题,看看大家对多文件了解多少:
1.自定义函数是否可以直接被调用?可以!!!
2.全局变量是否可以被直接调用?不可以!!!

在这里插入图片描述
在main文件中,我并没有包含test的头文件但是却可以调用起来,下面来主要解释一下为什么会出现这种情况?
因为报错是在编译阶段完成的,编译器在编译函数阶段没有发现什么特别大的错误。
在我们写完代码的时候,编译器要对我们写的代码要进行编译链接,是分别对每个源文件进行处理的,其中在编译这一整个过程中,我们写的函数是以某种形式存在的,编译器并不会对其进行详细处理,发现找不到这么一个自定义函数时候,编译器顶多报个警告而已,实际上到了链接这个过程编译器才会把两个文件链接起来,发现在另一个文件中找到了这么一个函数定义,也就运行成功了。

在这里插入图片描述
但是我们的定义的全局变量在编译阶段就会被编译器辨认出没有定义,自然也就编译器给你终止程序了,也就不会运行起来。

为了解决这个问题,我们C语言中有一个专门用来声明的关键字:extern关键字
只要我们在我们需要声明的文件中extern一下这个变量或者函数,编译器便可以在编译期间就可以知道有这么个变量允许调用,也就不会报错了。

但是这里我需要强调一个细节,是这样的,有很多初学者会把声明写成这个样子:

extern int n = 100;

这种写法对吗?显然是错误的,至于为什么,这牵扯到了变量的声明的本质理解。
声明并没有开辟空间,但是赋值操作需要空间存放值。
在C语言深度解剖第一节内容我们说过,变量定义本质上是开辟空间,变量声明本质上是告知,两者最大的差距在于有没有空间被创建出来,extern是声明的关键字,但是在上面的写法中却要给n赋值,既然要赋值就得需要空间啊,但是声明是没有开辟空间的!

看下面图片,声明之后没有任何报错甚至是警告也没有:
在这里插入图片描述
但是有个问题哈,就是我们在做一个项目的时候,往往都会有几十个甚至是几百个这样的源文件,我们难道是每个源文件在调用其他文件的变量或者函数的时候都需要extern声明吗?这样做的很大问题就是,维护成本太高了!

1.2头文件

为了解决这个问题,C语言中有专门的文件来存放声明内容,这个文件称为:头文件(后缀为.h)

在这里插入图片描述

头文件有一个比较普遍的问题就是重复问题,重复包含头文件也就是多重复了几次,也不会报错其实,但是会重复拷贝头文件内容,造成效率降低。
下面给出一个解决方法:在头文件中包含#pragma once

头文件中的内容应该写什么?库头文件,自定义函数的声明,变量声明,宏定义等等…

注意:
1.(库文件一半用<库文件名称>这个符号来进行声明,自定义源文件名称用“源文件名称”双引号来进行声明) 约定俗成而已。
2.函数声明与变量声明都建议带上extern,虽然说函数声明可以不用带extern,毕竟不写声明都可以允许,同时函数声明与定义要保持一致。

有了上面的知识进行铺垫,下面来介绍static关键字哈。

1.3static函数+全局变量与函数

直接给结论:
static+全局变量(函数):static的全局变量只可以在本文件中使用,不再允许直接被引用到其他文件当中,改变的变量(函数)的作用域。但是这里需要注意的是static修饰的变量或者函数可以被间接访问

在这里插入图片描述
被static修饰的局部变量和函数虽然不可以被直接访问,但是可以被间接进行访问:(函数嵌套)
在这里插入图片描述

2.static关键字修饰局部变量

static关键字修饰局部变量,会改变局部变量的生命周期,让临时的生命周期延长为类似于全局变量的生命周期。
临时变量(局部变量)的生命周期大家可以看下面代码来进行体会一下:

//体会临时变量的生命周期
void my_print(void)
{
	int a = 1;
	printf("%d\n", a);
	a++;
}
int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("it is the %d time:\n", i);
		my_print();
	}
	return 0;
}

在这里插入图片描述
这其实就是因为每次循环进入自定义函数的时候都是重新创建和销毁临时变量a,所以a的值始终是1…
但是,如果我给a加一个static进行修饰:
在这里插入图片描述

3.static关键字修饰的意义:

至于为什么C语言要造static关键字,其实我认为可以这样理解:
C程序是面向程序员的,最终是要造出一个比较大的项目来进行应用的,那这个比较大的项目就会涉及到很多的源文件,这就涉及到多文件,头文件等等,那么C程序运行时候,一定会进行一个数据交互,为了减少维护的成本,那么C设计者一定会允许变量函数跨文件进行访问,那么就再次验证的头文件的重要性,但是我想说如果所有文件都是互关的,那么对应的一些功能接口就会很多,那么意味着程序的暴露程度就会越高,那么代码的隐秘性就会越差,不利于代码的安全性;还有一点就是接口太多,用户的使用成本会比较高,为了解决上面说的两个问题,static关键字这种让变量程序文件隐藏起来的关键字应运而生。

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

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

相关文章

万界星空科技MES系统中的生产管理

MES系统能够帮助企业实现生产计划管理、生产过程控制、产品质量管理、车间库存管理、项目看板管理等&#xff0c;提高企业制造执行能力。 万界星空MES系统特点&#xff1a; 1. 采用强大数据采集引擎、整合数据采集渠道&#xff08;RFID、条码设备、PLC、Sensor、IPC、PC等&…

Ribbon客户端负载均衡

简介 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 简单的说&#xff0c;Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等…

已知输入图像大小为n、卷积核大小为f、卷积步长s,填充大小为p,求解输出图像大小。

问题描述&#xff1a;已知输入图像大小为n、卷积核大小为f、卷积步长s&#xff0c;填充大小为p&#xff0c;求解输出图像大小。 问题解答&#xff1a; 输出图像的大小可以使用以下的计算公式确定&#xff1a; 为了举例说明&#xff0c;假设有以下参数&#xff1a; 输入图像大…

深入理解Java中资源加载的方法及Spring的ResourceLoader应用

在Java开发中&#xff0c;资源加载是一个基础而重要的操作。本文将深入探讨Java中两种常见的资源加载方式&#xff1a;ClassLoader的getResource方法和Class的getResource方法&#xff0c;并介绍Spring框架中的ResourceLoader的应用。 1. 资源加载的两种方式 1.1 ClassLoader…

低代码开发平台支持复杂的业务逻辑和API对接吗

当今数字化时代&#xff0c;企业和组织面临着日益复杂的业务需求。为了应对这些挑战&#xff0c;低代码开发平台应运而生。白码低代码开发平台是一种高效、灵活且可扩展的开发工具&#xff0c;能够支持复杂的业务逻辑和第三方API对接&#xff0c;为企业带来更快速、更灵活的解决…

【Linux Shell】6. echo 命令

文章目录 【 1. 显示普通字符串 】【 2. 显示转义字符 】【 3. 显示变量 】【 4. 显示换行 】【 5. 显示不换行 】【 6. 显示命令执行结果 】 Shell 的 echo 指令用于字符串的输出。命令格式&#xff1a; echo string【 1. 显示普通字符串 】 #!/bin/bashecho "It is a …

OpenAI 拟每年投入 100-500 万美元,以获取新闻使用许可

最近两位媒体公司高层透露&#xff0c;OpenAI正积极与新闻出版公司进行谈判&#xff0c;提出每年投入100万至500万美元的费用&#xff0c;以获取将新闻文章用于训练大型语言模型的授权。 OpenAI目前正与大约十几家媒体公司进行谈判&#xff0c;但有报道称&#xff0c;即使对于…

【大数据】Zookeeper 集群及其选举机制

Zookeeper 集群及其选举机制 1.安装 Zookeeper 集群2.如何选取 Leader 1.安装 Zookeeper 集群 我们之前说了&#xff0c;Zookeeper 集群是由一个领导者&#xff08;Leader&#xff09;和多个追随者&#xff08;Follower&#xff09;组成&#xff0c;但这个领导者是怎么选出来的…

【公有云】通过AWS Endpoint service Endpoint 实现跨VPC请求收敛

背景 公司两个AWS VPC有互通的需求&#xff0c;分别是PROD-VPC和PCI-VPC。PCI是Payment Card Industry的简称&#xff0c;通常PCI-VPC部署支付后端服务。关于PCI的相关资料参考AWS PCI DSS&#xff0c;Payment Card Industry 数据安全标准。 PROD服务请求PCI服务是跨VPC访问&…

Spring官方移除Java8

大家好我是苏麟 , 今天聊聊怎么继续使用Java8做项目 . 在做项目的时候突然发现Java8没了 , 我心想 : " 嗯? IDEA出毛病了?" ,经过我仔细检查原来是spring官方不支持Java8了 . IDEA 内置的 Spring Initializr 创建 Spring Boot 新项目时&#xff0c;没有 Java 8 的选…

2024年如何借用电商新零售破局?新型商业模式——乐享甄选竞拍模式

2024年如何借用电商新零售破局&#xff1f;新型商业模式——乐享甄选竞拍模式 背景&#xff1a;经历疫情三年的黑天鹅&#xff0c;消费者对未来收入预期和不自信等悲观情绪&#xff0c;从而使得“勒紧腰带&#xff0c;少消费&#xff0c;不消费”&#xff0c;以简单实用成为了新…

静态网页设计——贵州美食(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1vC4y1K7de/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

企业选择通配符证书和多域名证书

随着互联网的发展&#xff0c;用户渐渐不再满足于只创建一个网站&#xff0c;因此&#xff0c;网站越来越多&#xff0c;管理多个网站的SSL证书的成本和时间也随之增加。为了节省管理多个站点的SSL证书的时间与成本&#xff0c;很多用户会选择通配符SSL证书与多域名SSL证书。这…

基于萤火虫算法优化的Elman神经网络数据预测 - 附代码

基于萤火虫算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于萤火虫算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于萤火虫优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…

docker daemon.json配置bip项需要注意的地方

docker是现在部署服务比较常用的一种方式&#xff0c;但是docker0网络默认为172.17.x.x网段&#xff0c;172.17这个网段是私有化ip段&#xff0c;而且在企业内部使用比较常见的一个网段&#xff0c;docker0创建后会创建一个172.17网段的路由&#xff08;可以通过ip route查看&a…

Jenkins分布式实现: 构建弹性和可扩展的CI/CD环境!

Jenkins是一个流行的开源持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续交付&#xff08;Continuous Delivery&#xff0c;CD&#xff09;工具&#xff0c;它通过自动化构建、测试和部署过程&#xff0c;帮助开发团队更高效地交付软件。Jenkins的…

Socks5代理ip和Https代理ip的区别,该如何选择?

Socks5代理和HTTPS代理都是计算机网络中的代理服务器&#xff0c;它们可以用于在客户端和其他服务器之间建立连接并充当中间人。 两种代理类型都有其优缺点和适用场景。 一、什么是Socks5代理 Socks5代理Socks5代理是一个网络协议&#xff0c;通过该协议可以建立TCP和UDP连接…

智慧校园全空间三维电子沙盘系统

一、概述 易图讯科技&#xff08;www.3dgis.top&#xff09;采用大数据、云计算、虚拟现实、物联网、AI等先进技术&#xff0c;自主可控高性能WebGIS可视化引擎&#xff0c;支持多用户客户端通过网络请求访问服务器地图和专题数据&#xff0c;提供地理信息数据、专题数据的并发…

2023-2024学年上学期算法设计与分析题期末考试模拟卷

2023-2024学年上学期算法设计与分析题期末考试模拟卷 文章目录 2023-2024学年上学期算法设计与分析题期末考试模拟卷单选题程序填空题输入格式:输出格式:输入样例1:输出样例1: 主观题 注意&#xff1a;该题集非标准答案&#xff0c;仅供参考&#xff0c;如果异议&#xff0c;请…

Linkage Mapper 工具参数详解——Centrality Mapper

【小白一学就会无需其他教程】此文档用于解析使用Linkage Mapper 各输入输出参数详情以及可能的影响&#xff0c;并介绍了如何解释模型输出结果和输出参数&#xff0c;适合刚入手的人。篇幅很长很啰嗦&#xff0c;是因为每个参数都解释的万分细致。 从以下链接中获取内容&…