(C语言)函数详解(下) 项目多文件操作 extern ,static详解

news2024/9/22 9:56:20

(C语言)函数详解上:http://t.csdnimg.cn/ceDqA

下面我们进行函数下的学习。

目录

我们

1. 函数的声明和定义

1.1 单个文件

1.2 多个文件

2. static和extern

2. 1 static 修饰局部变量:

2. 2 static修饰全局变量

2. 3 static 修饰函数


1. 函数的声明和定义

1.1 单个文件

一般我们在使用函数的时候 ,直接将函数写出来就使用了。

比如:我们要写一个函数判断一年是否是闰年。

上面代码中划红线的部分是函数的定义 ,划黄线的部分是函数的调用。这种场景下是函数的定义在函数调用之前 ,没有问题。

那如果我们将函数的定义放在函数的调用后边 ,如下:

这个代码在VS2022上编译 ,会出现下面的警告信息:

这是因为C语言编译器对源代码进行编译的时候 ,从第一行往下扫描的 , 当遇到第8行is_leap_year 函数调用的时候 ,并没有发现前面有is_leap_year的定义 ,就报出了上述的警告。

怎么解决这个问题呢?就是函数调用之前先声明一下is_leap_year这个函数 ,声明函数只要交代清 楚: 函数名 ,函数的返回类型和函数的参数。

如:int is_leap_year(int y);这就是函数声明 ,函数声明中参数只保留类型 ,省略掉名字也是可以的,如int is_leap_year(int);

代码变成

函数的调用一定要满足 ,先声明后使用;函数的定义也是一种特殊的声明 ,所以如果函数定义放在调用之前也是可以的。

1.2 多个文件

一般在企业中我们写代码时候 ,代码可能比较多 ,不会将所有的代码都放在一个文件中;我们往往会 根据程序的功能 ,将代码拆分放在多个文件中。

一般情况下 ,函数的声明、类型的声明放在头文件( .h) 中 ,函数的实现是放在源文件( .c)文件中。

如下:

add.c

add.h

test.c

有了函数声明和函数定义的理解 ,我们写代码就更加方便了。

2. static和extern

static 和  extern 都是C语言中的关键字。

static是静态的的意思 ,可以用来:

.  修饰局部变量

.  修饰全局变量

.  修饰函数

extern是用来声明外部符号的。

我们先了解一下作用域和生命周期。

作用域(scope)是程序设计概念通常来说,⼀段程序代码中所⽤到的名字并不总是有效的(可⽤),而限定这个名字的可用性的代码范围就是这个名字的作用域。

1. 局部变量的作用域是变量所在的局部范围。

2. 全局变量的作用域是整个工程(项目)。

生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。

1. 局部变量的生命周期是:进入作用域变量创建 ,生命周期开始 ,出作用域生命周期结束。

2. 全局变量的生命周期是:整个程序的生命周期。

2. 1 static 修饰局部变量:

代码一:

代码二:

代码1的test函数中的局部变量i是每次进入test函数从心创建变量(生命周期开始) 并赋值为0 ,然后 ++ ,再打印 ,出函数的时候变量生命周期将要结束(释放内存)。

代码2中 ,我们从输出结果来看 ,i的值有累加的效果 ,其实 test函数中的i创建好后 ,出函数的时候是i不会销毁的 ,重新进入函数也就不会重新创建变量 ,直接上次累积的数值继续计算。

结论:static修饰局部变量改变了变量的生命周期 ,生命周期改变的本质是改变了变量的存储类型 ,本来一个局部变量是存储在内存的栈区的 ,但是被static修饰后存储到了静态区。存储在静态区的变量和全局变量是一样的 ,生命周和程序的生命周期一样,程序结束 ,变量才销毁 ,内存才回收。但是作用域是不变的。

使用建议:未来一个变量出了函数后 ,我们还想保留值 ,等下次进入函数继续使用 ,就可以使用static 修饰。

2. 2 static修饰全局变量

代码1

add.c文件

test.c

代码2

add.c

test.c

extern 是用来声明外部符号的 ,如果一个全局的符号在A文件中定义的 ,在B文件中想使用 ,就可以使用 extern 进行声明 ,然后使用。

代码1正常 ,代码2在编译的时候会出现链接性错误:

结论:

一个全局变量被static修饰 ,使得这个全局变量只能在本源文件内使用 ,不能在其他源文件内使用。

本质原因是全局变量默认是具有外部链接属性的 ,在外部的文件中想使用 ,只要适当的声明就可以使用;但是全局变量被  static 修饰之后 ,外部链接属性就变成了内部链接属性 ,只能在自己所在的源文件内部使用了 ,其他源文件 ,即使声明了 ,也是无法正常使用的。

使用建议:如果一个全局变量 ,只想在所在的源文件内部使用 ,不想被其他文件发现 ,就可以使用 static修饰。

2. 3 static 修饰函数

代码1

add.c

test.c

代码2

add.c

test.c

代码1是能够正常运行的 ,但是代码2就出现了链接错误:

其实 static 修饰函数和 static修饰全局变量是⼀模⼀样的,⼀个函数在整个⼯程都可以使⽤,被static修饰后 ,只能在本文件内部使用 ,其他文件无法正常的链接使用了。本质是因为函数默认是具有外部链接属性 ,具有外部链接属性 ,使得函数在整个工程中只要适当的声明就可以被使用。但是被  static  修饰后变成了内部链接属性 ,使得函数只能在自己所在源文件内部使用。

使用建议:一个函数只想在所在的源文件内部使用 ,不想被其他源文件使用 ,就可以使用 static修饰。

感谢观看,欢迎讨论指正。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS—编译构建概述

编译构建是将应用/服务的源代码、资源、第三方库等,通过编译工具转换为可直接在硬件设备上运行的二进制机器码,然后再将二进制机器码封装为HAP/APP软件包,并为HAP/APP包进行签名的过程。其中,HAP是可以直接运行在模拟器或真机设备…

Java8 - LocalDateTime时间日期类使用详解

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

又挖到宝了!国人团队研发的AI视频工具PixVerse,这么好用居然还完全免费!(强烈推荐)

昨天发了一款国产免费的 AI 绘画工具 Dreamina 的介绍: 居然才发现!字节跳动旗下国产AI绘画工具Dreamina,这么好用居然还免费!(强烈推荐) 发现大家对国产 AI 工具还挺感兴趣的。今天继续帮大家挖国产的 A…

Python环境搭建:一站式指南

在当前AIGC技术蓬勃发展的背景下,Python作为人工智能领域最受青睐的编程语言之一,成为我们必须掌握的技能。因此,搭建一个适合自己的Python环境成为了每个Python开发者的首要任务。本文将为您提供一站式的Python环境搭建指南,帮助…

学习:Sora技术报告Video generation models as world simulators,2024.2

原文链接: Video generation models as world simulators (openai.com) 摘要: 我们探索了在视频数据上大规模训练生成模型。具体来说,我们在可变片长、分辨率和纵横比的视频和图像上联合训练文本条件扩散模型text-conditional diffusion mo…

腾讯云2024年优惠活动和云服务器优惠价格清单,3月最新整理

腾讯云优惠活动2024新春采购节活动上线,云服务器价格已经出来了,云服务器61元一年起,配置和价格基本上和上个月没什么变化,但是新增了8888元代金券和会员续费优惠,腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

上云还是下云,最大挑战是什么?| 对话章文嵩、毕玄、王小瑞

近半年来,公有云领域频频发生阿里云、滴滴等平台崩溃事件,与此同时,马斯克的“X 下云省钱”言论引起了广泛关注,一时间,“上云”和“下云”成为热议话题。在最近举办的 AutoMQ 云原生创新论坛上,AutoMQ 联合…

【计算机网络】五种IO模型与IO多路转接之select

文章目录 一、五种IO模型二、非阻塞IO1.fcntl2.实现函数SetNoBlock3.轮询方式读取标准输入 三、I/O多路转接之select1.初识select2.select函数原型3.socket就绪条件4.select的特点5.select缺点6.select使用案例--只读取数据的server服务器1.err.hpp2.log.hpp3.sock.hpp4.select…

力扣SQL50 使用唯一标识码替换员工ID 查询

Problem: 1378. 使用唯一标识码替换员工ID 思路 left join:左连接 Code select eu.unique_id,e.name from Employees e left join EmployeeUNI eu # left join 左连接 on e.id eu.id;

模型练习史

文章目录 肌肉光头vikingtorso死侍蓝毒液卡通girlwalletdog headman anatomy总结 肌肉光头 viking torso 死侍 蓝毒液 卡通girl wallet dog head man anatomy 总结 zbrush 与 blender 结合使用, 善 !

金融短信群发平台具有那些特点

金融短信群发平台的特点主要包括以下几个方面: 1.高效性:金融短信群发平台能够快速地发送大量的短信,使得金融信息能够迅速传达给目标客户,保证了信息的及时性和有效性。 2.安全性:金融短信群发平台对于信息的安全性非…

Java中使用poi+poi-tl实现根据模板导出word文档

场景 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出: 若依管理系统前后端分离版基于ElementUI和SpringBoot怎样实现Excel导入和导出_若依导出前端获得到后端的execl流之后怎么操作-CSDN博客 上面讲的是Excel的导出,如果是需要根据w…

VBA技术资料MF124:移动单个文件及移动某类型文件

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

MacBook将iPad和iPhone备份到移动硬盘

#创作灵感# 一个是ICloud不够用,想备份到本地;然而本地存储不够用,增加容量巨贵,舍不得这个钱,所以就想着能不能备份到移动硬盘。刚好有个移动固态,所以就试了一下,还真可以。 #正文# 说一下逻…

VUE3:统计分析页面布局+自适应页面参考

一、布局 <template><div class"container1"><div class"form white"><el-form :inline"true" :rules"rules" :model"queryParams" label-width"80px" ref"querParmRef"><e…

基于NeRF/Gaussian的全新SLAM算法

什么是SLAM&#xff1f; SLAM&#xff0c;即同时定位与地图构建技术&#xff0c;SLAM可以让机器人、无人机和其他自动化系统能够在未知环境中同时进行自我定位和环境映射。 为什么是NeRF-Based SLAM&#xff1f; 传统CG将输入图像重新投影再融合到新的视图摄像机中&#xff0c…

useState多次渲染页面卡顿 useMemo

useState多次渲染页面卡顿 state变化了组件自然应该重新进行渲染&#xff0c;但有时我们并不需要。 React.memo()(useMemo)是一个高阶组件&#xff0c;它接收另一个组件作为参数&#xff0c;并且会返回一个包装过的新组件&#xff0c;包装过的新组件就会具有缓存作用&#xff…

Qt 中Qwidget相关属性

文章目录 1. QWidget 核心属性1.1 enabled1.2 geometry1.2.1 window frame 的影响 1.3 windowTitle1.4 windowIcon1.4.1 qrc的使用 1.5 windowOpacity1.6 cursor1.7 focusPolicy1.8 styleSheet 1. QWidget 核心属性 在 Qt 中, 使⽤ QWidget 类表⽰ “控件”. 像按钮, 视图, 输…

MES系统在离散制造企业中的功能解析

随着信息技术的快速发展和制造业的转型升级&#xff0c;MES在离散制造企业中的作用日益凸显。MES系统不仅提高了生产效率和产品质量&#xff0c;还优化了资源配置&#xff0c;增强了企业的市场竞争力。 一、生产管理功能 MES系统能够实时监控生产现场的各种数据&#xff0c;包…

数据库常见理论常见面试题(总结)

一、前言 这里呢&#xff0c;博主会介绍一些平时关于数据库的理论的问题&#xff0c;比如数据库的三级模式两级映射、触发器、范式、存储过程、视图等等概念知识&#xff0c;但是像索引、事务、锁等内容&#xff0c;之前的文章就讲解过了&#xff0c;这里就不作过多的介绍了&am…