C语言函数声明以及函数原型

news2024/11/27 2:15:24

C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。

所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。

函数声明的格式非常简单,相当于去掉函数定义中的函数体,并在最后加上分号;,如下所示:

dataType functionName( dataType1 param1, dataType2 param2 ... );

也可以不写形参,只写数据类型:

dataType functionName( dataType1, dataType2 ... );

函数声明给出了函数名、返回值类型、参数列表(重点是参数类型)等与该函数有关的信息,称为函数原型(Function Prototype)。函数原型的作用是告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的形式,即使函数暂时没有定义,编译器也知道如何使用它。

有了函数声明,函数定义就可以出现在任何地方了,甚至是其他文件、静态链接库、动态链接库等。

【实例1】定义一个函数 sum(),计算从 m 加到 n 的和,并将 sum() 的定义放到 main() 后面。

#include<stdio.h>

//函数声明
intsum(int m,int n);//也可以写作int sum(int, int);

intmain(){
int begin =5, end =86;
int result =sum(begin, end);
printf("The sum from %d to %d is %d\n", begin, end, result);
return0;
}

//函数定义
intsum(int m,int n){
int i, sum=0;
for(i=m; i<=n; i++){
        sum+=i;
}
return sum;
}

我们在 main() 函数中调用了 sum() 函数,编译器在它前面虽然没有发现函数定义,但是发现了函数声明,这样编译器就知道函数怎么使用了,至于函数体到底是什么,暂时可以不用操心,后续再把函数体补上就行。

【实例2】定义两个函数,计算1! + 2! + 3! + ... + (n-1)! + n!的和。

#include<stdio.h>

// 函数声明部分
longfactorial(int n);//也可以写作 long factorial(int);
longsum(long n);//也可以写作 long sum(long);

intmain(){
printf("1!+2!+...+9!+10! = %ld\n",sum(10));
return0;
}

//函数定义部分
//求阶乘
longfactorial(int n){
int i;
long result=1;
for(i=1; i<=n; i++){
        result *= i;
}
return result;
}

// 求累加的和
longsum(long n){
int i;
long result =0;
for(i=1; i<=n; i++){
        result +=factorial(i);
}
return result;
}

运行结果:

1!+2!+...+9!+10! = 4037913

初学者编写的代码都比较简单,顶多几百行,完全可以放在一个源文件中。对于单个源文件的程序,通常是将函数定义放到 main() 的后面,将函数声明放到 main() 的前面,这样就使得代码结构清晰明了,主次分明。

使用者往往只关心函数的功能和函数的调用形式,很少关心函数的实现细节,将函数定义放在最后,就是尽量屏蔽不重要的信息,凸显关键的信息。将函数声明放到 main() 的前面,在定义函数时也不用关注它们的调用顺序了,哪个函数先定义,哪个函数后定义,都无所谓了。

然而在实际开发中,往往都是几千行、上万行、百万行的代码,将这些代码都放在一个源文件中简直是灾难,不但检索麻烦,而且打开文件也很慢,所以必须将这些代码分散到多个文件中。对于多个文件的程序,通常是将函数定义放到源文件(.c文件)中,将函数的声明放到头文件(.h文件)中,使用函数时引入对应的头文件就可以,编译器会在链接阶段找到函数体。

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

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

相关文章

《网络编程实战》学习笔记 Day9

系列文章目录 这是本周期内系列打卡文章的所有文章的目录 《Go 并发数据结构和算法实践》学习笔记 Day 1《Go 并发数据结构和算法实践》学习笔记 Day 2《说透芯片》学习笔记 Day 3《深入浅出计算机组成原理》学习笔记 Day 4《编程高手必学的内存知识》学习笔记 Day 5NUMA内存知…

【论文翻译】Non-local Neural Networks

摘要 卷积运算和循环运算都是每次处理一个局部邻域的构建块。在本文中&#xff0c;我们将非局部操作作为一组用于捕获长期依赖关系的构建块。受计算机视觉中经典的非局部均值方法[4]的启发&#xff0c;我们的非局部运算将一个位置的响应计算为所有位置特征的加权和。这个构建块…

「自控原理」5.2 频域稳定判据、频域分析

本节介绍奈奎斯特稳定判据、对数稳定判据&#xff0c;并引入稳定裕度 本节介绍频率特性法分析系统性能 本节介绍通过开环频率特性得到闭环频率特性的方法 文章目录频域稳定判据奈奎斯特稳定判据ZP−2NZP-2NZP−2N奈奎斯特稳定判据的推导对数稳定判据容易判断出错的情况临界稳定…

第九层(4):STL之duque类

文章目录前情回顾deque类deque类的功能deque和vector的区别deque容器的内部图deque类内的构造函数deque类内的赋值操作deque类内的大小操作deque类内的插入操作deque类内的删除操作deque类内的单个访问下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一…

设计模式 - 创建型模式_原型模式

文章目录创建型模式概述Case场景模拟⼯程Bad ImplBetter Impl &#xff08;原型模式重构代码&#xff09;创建型模式 创建型模式提供创建对象的机制&#xff0c; 能够提升已有代码的灵活性和可复⽤性。 类型实现要点工厂方法定义⼀个创建对象的接⼝&#xff0c;让其⼦类⾃⼰决…

AcWing蓝桥杯AB组辅导课08、数论

文章目录前言一、数论例题例题1&#xff1a;AcWing 1246. 等差数列&#xff08;最大公约数&#xff0c;第十届蓝桥杯省赛CB第7题&#xff09;分析题解&#xff1a;最大公约数例题2&#xff1a;AcWing 1295. X的因子链&#xff08;算数基本定理、欧拉筛选&#xff0c;多重集合排…

打工人必知必会(四)——股票期权属于劳动争议吗

目录 参考 一、核心概览 二、 注意 三、更多案例 参考 案例评析:股票期权纠纷是否属于劳动争议 股票期权&#xff08;限制性股票&#xff09;相关劳动争议问题 北上广深杭案例 一、核心概览 二、 注意 结合双方股权激励协议的签署背景、目的等因素来综合考量并作出相对准…

【数据结构】8.1 排序概述

文章目录排序的基本概念排序方法的分类存储结构排序的基本概念 什么是排序&#xff1f; 排序&#xff1a;将一组杂乱无章的数据按照一定规律顺次排列起来。 即&#xff0c;讲无序序列排成一个有序序列&#xff08;有小到大或由大到小&#xff09;的运算。 如果参加排序的数据…

MicroPython开发ESP8266——环境搭建

MicroPython开发ESP8266——环境搭建0.前言一、固件烧写1.使用乐鑫官方的烧写工具2.使用python中的esptool工具烧写3.使用uPyCraft烧写4.测试二、IDE工具安装1.windows环境搭建2.Linux环境搭建3.测试1&#xff09;软件设置2&#xff09;测试程序3&#xff09;烧录0.前言 最近刷…

NLP 语种检测 API 数据接口

NLP 语种检测 API 数据接口 180 语言检测&#xff0c;语种全称与缩写&#xff0c;返回置信度。 1. 产品功能 基于 NLP 分析文本的语种支持 180 多语种检测&#xff1b;语种缩写遵循 ISO 639-1 标准&#xff1b;包含检测到的语种置信度&#xff1b;毫秒级响应性能&#xff1b;…

Java 代码ccflow 代码分析

流程属性目录概述需求&#xff1a;设计思路实现思路分析1。代码流程参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. ha…

Linux中详解编译原理每一步

引言&#xff1a; 时间过的飞快&#xff0c;可以看出我们已经开始学习Linux了&#xff0c;但是我们学习Linux过程中&#xff0c;依然会涉及到很多的以前的知识&#xff0c;比如编译原理&#xff0c;我们的代码如何从一个源文件逐步变成一个可执行文件&#xff0c;当初我记得我…

流批一体计算引擎-8-[Flink]的Table API连接器

参考官方文档Table API连接器 1 Table API连接器概述 Flink的Table API和SQL程序可以连接到其他外部系统&#xff0c;用于读取和写入批处理表和流式表。source表提供对存储在外部系统&#xff08;如数据库、键值存储、消息队列或文件系统&#xff09;中的数据的访问。sink表将…

Sentienl学习笔记

PS&#xff1a;本文为作者学习黑马程序员Springcould视频笔记实际技术参考价值不大&#xff0c;文章将持续更新。 文章目录一. 什么是Sentienl1. 介绍2. 与Hystrix对比3. 主要特性二. Sentienl安装配置1. 下载安装包2. 启动三. Sentienl的使用1. Sentienl的整合2. 簇点链路四. …

每日学术速递1.27

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 前沿推介&#xff1a; ICLR 2023 ICLR 全称为国际学习表征会议&#xff08;International Conference on Learning Representations&#xff09;&#xff0c;今年将举办的是第 11 届&#xff0c;预计将于 5 月 1 日至 5 …

Redis实现附近商铺 | 黑马点评

一、GEO数据结构 1、入门 GEO是Geolocation的缩写&#xff0c;代表地理坐标。redis3.2中加入对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。 常见命令&#xff1a; GEOADD&#xff1a;添加一个地理空间信息&#xff0c;包含&…

springcloud3 Sentinel的服务熔断操作

一 服务熔断 1.1 服务熔断 Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时&#xff08;调用超时或者异常比例升高&#xff09;&#xff0c;对这个资源的调用进行限制&#xff0c;让请求快速失败&#xff0c;避免影响到其他资源进而导致级联错误。 当资源被降级后&…

07_linux中断控制

裸机开发要点 通用中断控制器(GIC) 中断类型、硬件中断号、分发器和cpu接口单元 中断向量表 一级查表、二级查表 中断处理流程 进入irq模式、保护现场、获取硬件中断编号、执行中断处理函数、还原现场 设备树构造 分为 gic中断控制器设备树节点 其他外设中断控制器节点 需要…

大数据相关组件

一、 HDFSHDFS是hadoop的核心组件&#xff0c;HDFS上的文件被分成块进行存储&#xff0c;默认块的大小是64M&#xff0c;块是文件存储处理的逻辑单元。HDFS是Master和Slave的结构。分NameNode、SecondaryNameNode、DataNode这几个角色。NameNode&#xff1a;是Master节点&#…

springcloud3 Sentinel的搭建以及案例操作

一 sentinel的概念 1.1 sentinel Sentinel是分布式系统流量控制的哨兵&#xff0c;阿里开源的一套服务容错的综合性解决方案。 主要用来处理&#xff1a; 服务降级 服务熔断 超时处理 流量控制 sentinel 的使用可以分为两个部分: 核心库&#xff08;Java 客户端&#…