【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关键字这种让变量程序文件隐藏起来的关键字应运而生。

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

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

相关文章

Zookeeper(持续更新)

VIP-01 Zookeeper特性与节点数据类型详解 文章目录 VIP-01 Zookeeper特性与节点数据类型详解正文1. 什么是Zookeeper&#xff1f;2. Zookeeper 核心概念2.1、 文件系统数据结构2.2、监听通知机制2.3、Zookeeper 经典的应用场景3.2. 使用命令行操作zookeeper 正文 什么是Zookee…

Java学习——设计模式——行为型模式1

文章目录 行为型模式模板方法策略模式命令模式责任链模式 行为型模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;涉及算法与对象间职责的分配。 行为型模式分为类行为模式和…

CyberLink的视频编辑软件PowerDirector Ultimate 2024 22.0版本在win系统下载与安装配置

目录 前言一、PowerDirector Ultimate安装二、使用配置总结 前言 PowerDirector Ultimate是由CyberLink公司开发的一款视频编辑软件&#xff0c;其为高级版本&#xff0c;拥有多种强大的视频编辑和效果功能。该软件具有许多强大的功能和工具&#xff0c;包括多轨时间线编辑、视…

使用爬虫爬取热门电影

文章目录 网站存储视频的原理M3U8文件解读网站分析代码实现 网站存储视频的原理 首先我们来了解一下网站存储视频的原理。 一般情况下&#xff0c;一个网页里想要显示出一个视频资源&#xff0c;必须有一个<video>标签&#xff0c; <video src"xxx.mp4"&…

关于《码农翻身》一书的读后感以及自己的一些拙见汇总

书籍名称 《码农翻身》 | 刘欣&#xff08;码农翻身&#xff09; 著 | 文章将以问答的形式进行叙述 1.是从什么渠道接触到《码农翻身》的 一个工作日的下午&#xff0c;手上的任务基本结束&#xff0c;翻了翻桌上的书和笔记之类的&#xff0c;同事见我在看书&#xff0c;于是向…

数据结构(五)——初识线性表

&#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在csdn获奖荣誉: &#x1f3c6;csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ …

redis安装与配置

目录 1. 切换到 root 用户 2. 搜索安装包 3. 安装 redis 4. 查看 redis 是否正常存在 5. 修改ip 6. 重新启动服务器 7. 连接服务器 1. 切换到 root 用户 通过 su 命令切换到 root 用户。 2. 搜索安装包 apt search redis 这里安装的是下面的版本&#xff1a; 3. 安装 …

Go语言中的HTTP请求和响应处理

在Web开发中&#xff0c;HTTP请求和响应是核心的交互方式。Go语言&#xff0c;作为一种高效且现代的编程语言&#xff0c;为开发者提供了简洁、强大的工具来处理HTTP请求和响应。本文将简要介绍在Go语言中如何处理HTTP请求和响应。 在Go语言中&#xff0c;HTTP请求和响应的处理…

ReCAPTCHA 解决方案的自动识别和解决方法

ReCAPTCHA&#xff0c;作为广泛使用的安全措施&#xff0c;旨在区分人类和自动化机器人。然而&#xff0c;技术的进步导致了自动识别和解决 ReCAPTCHA 挑战的方法的发展。在本文中&#xff0c;我们将探讨自动 ReCAPTCHA 识别和解决技术的概念&#xff0c;以及创新解决方案 Caps…

Spring见解4 基于注解的AOP配置

5.基于注解的AOP配置 5.1.创建工程 5.1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

学习使用layPage, 多功能JS分页组件/插件的方法

学习使用layPage, 多功能JS分页组件/插件的方法 效果图分页代码 效果图 点击查看链接 分页代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>Layui</title><meta name"renderer" content"we…

SpringBoot中动态注册接口

1. 说明 接口注册&#xff0c;使用RequestMappingHandlerMapping来实现mybatis中动态执行sql使用github上的SqlMapper工具类实现 2. 核心代码片段 以下代码为spring动态注册接口代码示例 Autowired private RequestMappingHandlerMapping requestMappingHandlerMapping;publ…