当前位置:网站首页>赶紧进来!!带你了解什么是多文件,并轻松掌握 extern和static c语言关键字的用法!!!
赶紧进来!!带你了解什么是多文件,并轻松掌握 extern和static c语言关键字的用法!!!
2022-07-24 05:16:00 【牛牛要坚持】
想必每个人一开始了解static,extern都有很多困惑和不解吧,仔细阅读这篇博客,会带你对他们有个更深层次的认识,所谓一回生,二回熟,知识接受都是循序渐进,接触多了,自然就懂了~
多文件的概念
在一个工程中,我们为了方便管理和维护代码,通常会用多个.c 源文件,
而单纯的使用源文件,组织项目结构的时候,维护成本会变得越来越高,为了解决大型项目维护成本问题,会使用.h头文件。
.c源文件和.h头文件的使用和注意事项
当我们在一个.c源文件定义函数或全局变量时,某个函数出错了想要调试,往上一看七七八八的函数定义堆在一起,不但难找还眼花缭乱,这时我们可以再创建一个.c源文件,在新创的文件里进行各种函数和全局变量的定义,而要用到外部源文件定义的函数或变量就要声明,此时创建一个.h头文件用来放外部的函数和变量的声明,最后每个.c源文件用将.h头文件包含,表示文件里可以访问.h头文件的内容,并且.h是会被包含的,所以里面还可以放要用到的预处理指令define等。讲的有的复杂,先看一些图片了解一下↓


这个是一个顺序表结构程序,具体实现先不了解,可以看到用了两个.c源文件和一个.h头文件,它们各个文件放的内容都和我上面讲到的一样,将一个工程分多个文件实现可以解决维护成本问题。
注意事项:
1.这些多个文件共同构建成一个工程,而一个工程只能有一个main函数,所以,只能有一个.c源文件里有main.
2…h头文件基本会被多个源文件包含,则可能会出现头文件重复包含的问题,为避免这种情况可以用预处理指令#include pragma放在头文件开始,可以解决头文件被重复包含的问题。
extern的使用和注意事项
上面说到声明外部函数或变量,就要用到extern这个关键字,当在一个.c源文件里定义了一个全局变量或函数,你要在另一个.c源文件里访问则要使用extern声明外部函数或变量,具体实现如下↓
在.h头文件里用到了extern 声明了外部函数和变量,此时可以在本文件中访问声明的外部文件函数和变量。
注意事项:
声明变量时需要 变量的类型和变量名,且声明的时候不能直接对其变量里进行赋值。
就比如声明就像你跟别人说你有东西放在了一个地方,说的时候只是跟对方声明了位置,并不能立即到那个地方拿这个东西,只能声明后的去到那个地方拿东西,即在声明后才能访问其外部变量。声明函数 要写函数的返回类型,函数名,函数的参数类型,这里最好把对应的函数参数变量名也加上,方便识别。
当函数和变量都放在整个main函数后面时,此时文件是无法访问它们的,要想访问到,也需要在文件开始用extern声明上他们才能访问!最后,extern声明外部函数或变量时可以省略此关键字如上图1第20行代码,但不建议这样操作,容易搞混,建议还是加上extern
static的使用
在c语言中static有两个作用而c++中有三种,这里介绍c语言里的两种作用
一、static修饰变量
static声明局部变量:
先上一段代码题~
此代码最后输出的结果是什么?
答案是10个1.
这个代码题就牵扯到了作用域和生命周期,不懂这两个关键词可以在我上一篇博客中看一下。
当了解了这两个知识点做这道题就很轻松了,接下来看下一道题↓
int num前加了static修饰,这次运行结果又是什么呢?
答案是1-10,
这就是static的第一个用法,static修饰局部变量时,会延长其生命周期,此时num的生命周期和全局变量生命周期一样,只有在文件结束时才被释放,但作用域还在text函数内部。
在函数里的局部变量是会放在栈区里的,但static修饰的局部变量是在栈区吗,答案是:
不在!,因为栈区在函数结束后会被释放里面所要空间都会还给操作系统,而被static修饰的局部变量延迟了生命周期,空间不会被释放,
此时他是存放在 静态区的。
内存分为三个区:栈区、堆区、静态区
栈区主要放局部变量、函数参数
堆区主要是用于动态内存开辟的,涉及malloc、calloc、realloc库函数。
而静态区是用来存放全局变量、和static修饰的局部变量的。这样就好理解 它的生命周期和全局变量一样。
static修饰全局变量
先上一段代码
这是两个文件,请问结果输出是什么?
输出结果是1,
这个题是对上面将的extern的练习~ 在外部文件里有一个全局变量int n=1 此时在本文件里 用extern 声明了外部变量,则此时此文件后续可以对外部文件里的变量n进行访问。
再看一题↓
在外部全局变量前面有static修饰此时结果为什么呢?
答案是:编译错误!! 我们得出static修饰全局变量时,其变量不能被外部文件访问,只能在本文件中被访问。
以上是static修饰变量产生的作用,再看第二个作用
二、static修饰函数
老规矩,先做一道题↓ 程序输出结果是什么?
当然是好好学习天天向上啦~ 这个题也是extern的用法,声明了外部文件的函数 在本文件里才能对其访问。现在对extern有个大致的了解了吧~~
如果在此函数前有static修饰结果又是什么呢?
答案和static修饰全局变量一样,编译错误!!!
这里就有疑惑了,既然我们写文件不就应该可以让外部文件能够访问才创建多文件吗,static修饰函数或变量又不给外部文件访问那有什么意义呢?
我们要知道,以后写代码不仅仅是你自己一个人的工作,而是你和你的同事一起合作,而你们共同写这一个模块时,免不了函数或变量会出现名字重复的情况,那此时则在声明时有两个同名函数或变量就会出错,而有了static修饰后函数或变量后,它就不会被外部函数声明访问,就解决了这一问题。
这串代码又是什么意思呢,
答案还是好好学习天天向上,他是调用text函数实现的吗,text被static修饰了显然无法访问text,但jiekou函数没有被static修饰,此是我访问的是jiekou函数的内容,而在jiekou函数里我运行了text函数 使得最后程序执行了text函数的功能,此时text函数无法被外部函数调用,但我在其jiekou函数里提供了一个接口 调用jiekou函数可以实现text函数的功能就起到一个提高安全性的作用,这就为项目维护提供了一个安全保证。
所以,static的两个作用都是有其意义的!!!
static的用法总结
我们可以得出static修饰局部变量时会延长其生命周期会保留里面的数据以便下次访问,static修饰全局变量和函数时,表示该全局变量和函数只能在本文件内部被访问,在外部文件里即使声明了,也无法对其访问!!
多文件的概念 ,extern,static的两大用法到这里结束了,相信你对其有了个大概的了解,本人知识储备有限,如果文章有什么错误,还请积极指正!!
本人还会在接下来继续努力学习,写更多学习价值质量高的博客,请多多点赞关注支持!!!!
边栏推荐
猜你喜欢

Introduction to reflection

Web development

【Pytorch】conv2d torchvision.transforms

【sklearn】tree.DecisionTreeClassifier

Hotel IPTV digital TV system solution

C语言入门篇 三.数组 四.操作符

I'm interested in reading efficient reading - the most cost-effective self investment

DNS domain name resolution service

Machine vision learning summary

1. Pedestrian recognition based on incremental occlusion generation and confrontation suppression
随机推荐
Integration of SSM
Add, delete, modify and check JDBC
C table data De duplication
Handwritten ORM framework
C语言起步
A collation of the basic usage of numpy
PXE efficient batch network installation
C语言入门篇 一.分支和循环语句
模拟加法 & 结构体基本用法
This is the first article
T 11-20
【sklearn】RF 交叉验证 袋外数据 参数学习曲线 网格搜索
用双向链表实现栈(C)
【Pytorch】Dataset_DataLoader
在屏幕上绘制一个正方形,用ice.bmp对正方形做纹理映射;在正方形后绘制一个黄色的茶壶,假设正方形是透明的,绘制茶壶与正方形的混合效果;通过A,D,W和K按键调整茶壶在X轴和Y轴的位置,具体如下
用C语言写出三子棋
Pointer learning diary (II)
力扣、牛客网->链表相关题目(篇一)(c语言)
C语言从入门到入土(二)
统计学之样本和总体的关系: 样本成功比例+中心极限定理(样本均值)
















