【C语言】函数(三):为什么要有函数声明

目录

  • 前言
  • 函数定义
  • 函数声明
  • 为什么要有函数声明
    • 原因1:分模块编程
    • 原因2:静态库文件

前言

在上文中已经介绍了函数调用,分为传值调用和传址调用,以及嵌套调用和链式访问。在本文中将介绍函数的声明和定义,以及为什么要有函数的声明?

我们先看这么一段代码:

int Add(int x, int y)
{
	return x + y;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int result = Add(a, b); 
	printf("%d", result);

	return 0;
}

这段代码是利用一个函数实现加法操作。我们好像没有看到函数声明。不免疑问函数声明真的有必要吗?

函数定义

函数的定义就是函数的具体实现。函数定义是一种特殊的声明。

在前言部分的代码中,函数定义就是:

int Add(int x, int y)
{
	return x + y;
}

函数声明

声明,顾名思义就是告诉。函数声明就是告诉编译器有一个函数叫什么,参数是什么,返回类型是什么等等。当然函数声明一定在函数的使用之前,要满足先声明再使用。

在前言部分的代码中没有函数声明。这是因为我们一般将函数定义写在主函数的前面,主函数在最后。如果将函数定义写在主函数的后面,那么在程序前面就需要进行函数的声明。原因如下:程序真正开始执行的时候,编译器会先从最开始往后扫描,扫描到主函数后开始正式编译,函数调用时往往都写在主函数内部,如果你将函数写在了主函数的后面并且在前面没有声明,也就是说编译器在编译的过程中进行到函数调用的部分了,但是它从开始一直扫描到这里的时候都没有见过你要调用的函数在哪里,所以它找不到你的函数在哪里,于是就会报错,就像这样:
在这里插入图片描述
这个时候,我们只需要在程序前面进行函数声明就可以了:
在这里插入图片描述
一定要注意函数声明结尾要有分号

为什么要有函数声明

原因1:分模块编程

我们已经了解过函数声明了,难道函数声明就是这样用的吗?我把函数写在主函数前面不就可以了,函数声明不是多此一举?我们认为它是一个规定就行了?

我们想一想,在公司中一个项目不可能只有你一个人进行代码的编写,一般是成百上千的人在写,这个时候所有人都在一个源文件里面写程序,等你写完他写,他写完下一个人写,这要是完成一个产品,不得到猴年马月去了,也容易乱套,甚至出错都不知道是哪的错,是谁写的代码出了错。

公司都是团队协作开发的,所以需要分模块去写,方便协作,最后进行整合。
假设我现在有一个团队,现在要开发一款计算器(假设这个计算器的实现很复杂),要有加减乘除四则运算和其他各种运算。

在这里插入图片描述
如果是实现加法操作的程序员就需要编写这样的代码:
在这里插入图片描述
最后负责各个模块的程序员写完后将它们整合起来就可以了。

原因2:静态库文件

假设现在你写了一个非常厉害的库,能够实现非常复杂的操作,这个时候某公司非常需要这样的功能,你可以选择把它卖出去挣钱,又不卖源代码,于是你将你写的库的静态库文件(后缀是.lib,打开静态库文件不会出现源代码)和头文件卖给某公司,头文件里可能是几百个函数声明(所以函数的声明一般放在头文件中),让某公司知道这些函数怎么使用。可能该公司还会每年给你多少钱让你对这个进行维护,甚至可能直接重金招聘你。

改成静态库的方法:
在这里插入图片描述
公司要使用你的库,就需要在他们编写的文件中导入你的静态库。

#include "add.h" //公司需要使用你卖给他们的头文件
#pragma comment(lib,"add.lib") //导入静态库,假设你写的库就是add

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

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

相关文章

使用 Pinia 的五个技巧

在这篇文章中,想与大家分享使用 Pinia 的五大技巧。 以下是简要总结: 不要创建无用的 getter在 Option Stores 中使用组合式函数(composables)对于复杂的组合式函数,使用 Setup Stores使用 Setup Stores 注入全局变量…

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(十二)

SUM()求和函数 SUM() 函数返回数值列的总和。 语法: SELECT SUM(column_name) FROM table_name;column_name:字段名(必须是数值字段) table_name:表名 示例: 查询每位同学的总分&#xff1a…

2、单片机及开发板介绍

单片机介绍 单片机,英文Micro Controller Unit,简称:MCU 内部集成:CPU、RAM(随机存储器)、ROM(只读存储器)、定时器、中断系统、通讯接口等 作用:信息采集(传感器)、处理&#xff0…

[autojs]利用console实现悬浮窗日志输出

"ui"; ui.layout(<vertical><button id"autoFloatWindow" text"开启悬浮窗" textSize"15sp" /><button id"autoService" text"开启无障碍服务" textSize"15sp" /><button id"…

聚水潭连接API,集成无代码开发,优化电商平台运营

聚水潭连接API&#xff0c;实现电商平台的高效运营 聚水潭作为一款SaaS ERP解决方案&#xff0c;通过其出色的产品和服务&#xff0c;迅速在市场上占据了一席之地。而其无代码开发的特点&#xff0c;为电商系统和客服系统的连接与集成提供了便利。聚水潭开放平台的优势在于&am…

[ChatGPT]ChatGPT免费,不用翻墙!?——你需要的装备

系列文章目录 【AIGC】服务于人类&#xff5c;一种新的人工智能技术-CSDN博客 文章目录 目录 系列文章目录 文章目录 前言 一、天意云网站 ​编辑 二、使用步骤 可以看到有云服务器、Rstudio以及我们的ChatGPT&#xff0c;我这次主要分享ChatGPT&#xff0c;其他的有机会我再给…

如何避免Steam搬砖项目中账号被盗

购买steam余额有风险吗&#xff1f;及N种被红锁的情况 相信最近很多人都已经听说过steam游戏搬砖这个项目&#xff0c;也叫CSGO游戏搬砖项目&#xff0c;还有人叫它&#xff1a;国外steam游戏汇率差项目&#xff0c;无论怎么称呼&#xff0c;都是同一个项目。 那么什么是stea…

【SpringMVC】 参数传递

一.项目目录 SpringBoot项目创建之后会生成很多目录 删除不需要的这四个文件/目录 目录 二.Spring MVC 和 MVC Spring MVC(Spring Web MVC) Spring Web MVC 是⼀个 Web 框架 MVC : Model View Controller 它是一种思想 , 它把一个项目分成了三个部分. View视图层 界面显示…

HOOPS Web平台助力开发3D应用,实现超大规模3D web轻量化渲染与数据格式转换!

一、包含的软件开发工具包 HOOPS Web平台帮助开发人员构建基于Web的工程应用程序&#xff0c;提供高级3D Web可视化、准确快速的CAD数据访问和3D数据发布。 HOOPS Web平台包括三个集成软件开发工具包 (SDK)&#xff1a; &#xff08;1&#xff09;Web端3D可视化引擎 HOOPSCom…

labview 安捷伦 34970A 采集温度等

本文详细描述了怎么用安捷伦34970A采集温度&#xff0c;并列出了labview的下载链接&#xff0c;具有一定的参考价值。 1.必要条件&#xff1a; RS-232电缆一根 IO Libraries Suite 软件 BenchLink Data Logger 软件 软件可以在http://www.keysight.com.cn下载 检查RS-232…

Hadoop学习总结(MapReduce的数据去重)

现在假设有两个数据文件 file1.txtfile2.txt2018-3-1 a 2018-3-2 b 2018-3-3 c 2018-3-4 d 2018-3-5 a 2018-3-6 b 2018-3-7 c 2018-3-3 c2018-3-1 b 2018-3-2 a 2018-3-3 b 2018-3-4 d 2018-3-5 a 2018-3-6 c 2018-3-7 d 2018-3-3 c 上述文件 file1.txt 本身包含重复数据&…

本地canal安装和使用

1、组件版本 canal.deployer-1.1.7 kafka_2.13-2.6.0 jdk8 apache-zookeeper-3.6.0-bin mysql5.7 2、解压canal.deployer-1.1.7 2.1、修改canal.properties配置文件 ##改为kafka canal.serverModekafka## 改为instance canal.destinations instance## 改为true&#x…

强化学习------贝尔曼方程

目录 前言基础知识马尔可夫决策过程 (Markov decision process, MDP)回报(Return)折扣回报(Discounted Return) State Value&#xff08;状态价值函数&#xff09;贝尔曼方程的推导贝尔曼方程的矩阵形式Action Value&#xff08;动作价值函数&#xff09;贝尔曼最优公式 前言 …

基于 Modbus 的工业数据采集、控制(part 2)

基本处理流程 服务器 parse_and_process(char * input)//input :post请求发送的正文 {...// 请求 modbus 数据else if(strstr(input, "modbus_get")){return handle_get(sock, input);}// 控制 modbus 设备else if(strstr(input, "modbus_set")){return …

【OpenAI】经营权争夺战关系图

《OpenAI新模型曝重大飞跃&#xff1a;AGI雏形或威胁人类&#xff0c;也成Altman被解雇导火索&#xff01;》摘要如下: [一句话总结] OpenAI的Q*项目取得突破&#xff0c;解决了以前未见过的数学问题&#xff0c;为AI发展带来重要的技术里程碑。 [文章概览要点] OpenAI内部研…

redis运维(十四) hash缓存案例

一 缓存案例 ① 需求 ② 个人理解 策略&#xff1a;不更新缓存&#xff0c;而是删除缓存大部分观点认为&#xff1a;1、做缓存不应该是去更新缓存,而是应该删除缓存2、然后由下个请求去缓存,发现不存在后再读取数据库,写入redis缓存 高并发场景下,到底先更新缓存还是先更…

完美解决RuntimeError: implement_array_function method already has a docstring

文章目录 一、报错原因--numpy版本太低二、更新numpy总结 一、报错原因–numpy版本太低 当收到 "RuntimeError: implement_array_function method already has a docstring" 错误时&#xff0c;这可能是由于在numpy的某个版本中&#xff0c;该方法的文档字符串&…

vue3-生命周期

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-生命周期 目录 vue3生命周期 vue3生命周期钩子 1.1 onMounted() 1.2 onUpdated() 1.3 onU…

2024年天津专升本招生计划及其收费标准

2024年天津专升本招生计划及其收费标准 天津农学院 文史类 人力资源管理 20 4400 文史类 物流管理 20 4400 理工类 人力资源管理 10 4400 理工类 物流管理 10 4400 理工类 水文与水资源工程 30 5400 有专业限制 理工类 水产养殖学 20 4400 有专业限制 天津…

ui5使用echart

相关的代码已经发布到github上。 展示下相关的实现功能 1、柱状图-1 2、柱状图-2 3.折线图 4.饼状图 如何使用&#xff1a; 使用git clone项目到本地 git clone https://github.com/linhuang0405/com.joker.Zechart找到index.html。在vscode里右键选择Open with Live Serve…