C语言模块化

news2024/10/7 12:17:47

🌞欢迎来到C语言的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


 使用头文件进行模块化编程

假设我们现在有这样一个项目

假设有甲、乙两人,同时开发一个软件,功能是输入两个整数,输出它们的加减乘除四种结果。

开发过程中,由甲负责主函数的编写和调用。

乙负责加、减、乘、除函数的代码编写。

丙负责乘、除函数的编写。

在实际工作中,这两个人有各自不同的工作空间和计算机,不方便同时编辑同一个源代码文件,最好是每个人在各自的工作环境下编写各自的源代码文件,最后能把他们编写的文件有效集中起来组成完成特定的程序。

(1)新建一个头文件

 

(2)项目结构如下:

使用头文件

    上面的例子是比较简单的应用,在应用函数时先声明(例如8.1节的实例,main函数中声明了三个函数),然后再在编程应用函数。然而,在实际项目中,有成百上千的函数要编写,且函数在不同开发人员之中应用,一旦利用别人的函数多了,自己的代码因为声明函数的代码显示非常臃肿,而且一个实际工程项目,一般需要给每个函数做注释,解释函数具有的功能、参数的意义和函数的用法等,这些工作在调用前用声明来做,不利于阅读程序代码,也不易于维护,为解决这样的问题,就产生了一种称为头文件的文本文件,用于声明和描述函数。之前我们用#include后跟一个.h文件,这个.h文件就是头文件,我们可以把函数的描述放在这个头文件中,然后在其它文件(如.c文件)中直接利用#include加头文件的方式进行调用。

jisuan.h

//定义加法
int add(int a, int b)

{

	return a + b;

}
//定义减法
int sub(int a, int b)

{

	return a - b;

}
//定义乘法
int mul(int a, int b)

{

	return a * b;

}
//定义除法
float div(int a, int b)

{

	return 1.0f * a / b;

}

这时main.c源文件就可以写成如下代码。

#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
#include"jisuan.h"

int main(void)

{

int a,b;

printf("输入两个整数: ");

scanf("%d %d",&a,&b);//为节省篇幅,没考虑除数为0的情况。

printf("%d,%d两数加减乘除的结果是: ",a,b);

printf("%d,%d,%d,%f\n",add(a,b),sub(a,b),mul(a,b),div(a,b));

return 0;

 }

结果:

 

说明用#include加头文件的方式也可以实现相应的功能。

头文件中放入函数声明,函数的具体实现放在另外的.c文件中,也就是将声明和实现分离。这种开发模式,就是实际中经常用的模块化开发,也被人称为面向接口的开发。

在这种开发模式下,如果在开发之前,做好头文件内的内容,剩下的事就是按头文件去写代码,开发就变得有据可依了。开发完成后,编译源代码,头文件就是一份使用方法和函数功能的说明书,可以很方便的将.c文件和头文件提供给需要使用的用户。细心的读者可能已经发现了,包含自己的头文件时,用的是" ",而不是<>,这两者是有区别的,#include< > 引用的是编译器类库路径里面的头文件。#include " " 不仅可引用类库中的头文件,还可以引用程序目录的相对路径中的头文件,因为jisuan.h是与main.c是同一个目录,所以用" "。当然头文件可以绝对路径指定,如#include "E:\\wang\\jisuan.h"(windows系统),#include "home\\wang\\jisuna.h"(Linux系统),但通常不这样做,原因是当程序在新的环境中执行时,要在新的环境中专门建立相应的目录,并把头文件复制到这个目录中,非常麻烦。如果头文件是放在.c文件所在目录的子目录下,可以写成“#include "子目录\\jisuanFirst.h "”。

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

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

相关文章

MySQL的行锁总结

文章目录前言一、行锁的介绍二、行锁的使用三、使用行锁所带来的问题四、死锁和死锁检测前言 上篇文章已经学习了MySQL的全局锁和表锁&#xff0c;今天这篇文章我们对行锁进行以下学习 一、行锁的介绍 行锁就是针对数据表中行记录的锁&#xff0c;比如事务A更新了一行&#x…

切面AOP

1.2 AOP体系与概念 简单地去理解&#xff0c;其实AOP要做三类事&#xff1a; 在哪里切入&#xff0c;也就是权限校验等非业务操作在哪些业务代码中执行。 在什么时候切入&#xff0c;是业务代码执行前还是执行后。 切入后做什么事&#xff0c;比如做权限校验、日志记录等。 因…

ES索引切分

提示&#xff1a;对于一些日志类的数据&#xff0c;我们常用到es作为存储&#xff0c;数据量过大时&#xff0c;可能会用到索引切分&#xff0c;这里可以参考 ES索引切分前言方案一&#xff1a;ES索引切分验证&#xff08;policy策略&#xff09;配置ilm策略 &#xff08;max_d…

照片如何修复清晰度?这些修复方法值得你收藏

我们都知道以前的拍照技术落后&#xff0c;拍摄出来的照片像素都比较低&#xff0c;从而导致照片有些模糊不清&#xff0c;再加上我们保存不当&#xff0c;很多旧照片都变得模糊破损&#xff0c;因此很多人为了不让这些旧照片消失&#xff0c;都会选择找人来修复这些旧照片&…

爬虫 大规模数据 采集心得和示例

本篇主要介绍网站数据很是大的采集心得数据库1. 什么样的数据才能称为数据量大&#xff1a;编程我以为这个可能会由于每一个人的理解不太同样&#xff0c;给出的定义 也不相同。我认为定义一个采集网站的数据大小&#xff0c;不单单要看这个网站包括的数据量的大小&#xff0c;…

MySQL高级【锁】

1&#xff1a;锁的概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、 RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数据库必…

基于java springmvc+mybatis酒水商城管理系统设计和实现

基于java springmvcmybatis酒水商城管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取…

5.7、TCP 可靠传输的实现

1、TCP基于以字节为单位的滑动窗口来实现可靠传输 TCP 基于以字节为单位的滑动窗口\color{red}以字节为单位的滑动窗口以字节为单位的滑动窗口来实现可靠传输 如下所示&#xff0c;假定数据传输只在一个方向进行 这是发送方待发送字节的序号 假设发送方收到了来自一个接收方的…

RHCE第六天之DNS域名解析服务器详解

文章目录一、 域名解析服务器介绍二、DNS域名解析的过程三、搭建DNS服务器的详细配置四、实验练习一、 域名解析服务器介绍 DNS&#xff08;Domain Name System&#xff09; 是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够…

Node转换Excel成JSON

目前想使用Cocos Creator做一个文字游戏&#xff0c;类似于我的人生重开模拟器。 那么其中最重要的一点就是关于数据的存储了。在我的人生重开模拟器中大部分事件和天赋的数据是存储在excel表格当中的&#xff0c;当然如果要使用Cocos Creator&#xff0c;因为我不准备布置服务…

JDBC核心技术_第8章:数据库连接池

目录8.1 JDBC数据库连接池的必要性8.2 数据库连接池技术8.3 多种开源的数据库连接池8.3.1 C3P0数据库连接池8.3.2 DBCP数据库连接池8.3.3 Druid&#xff08;德鲁伊&#xff09;数据库连接池8.1 JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时&#xff0c;传统的模…

【蓝桥杯系列】2020省赛真题之回文日期

⭐️前面的话⭐️ 本篇文章介绍来蓝桥杯真题之回文日期的题解&#xff0c;展示语言java。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4cc;本文由未见花闻原创&#xff0c…

ArcGIS基础实验操作100例--实验81创建点群最小边界几何

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验81 创建点群最小边界几何 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

MySQL是怎么保证高可用的?

在上一篇文章中,我和你介绍了 binlog 的基本内容,在一个主备关系中,每个备库接收主库的 binlog 并执行。 正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。 但是,MySQL 要提供高可用能力…

Python中zipfile压缩包模块的使用

本文主要介绍了Python中zipfile压缩包模块的使用&#xff0c;zipfile 模块提供了创建、读取、写入、添加及列出 ZIP 文件的工具&#xff0c;本文做一个简单的总结。 简介 ZIP 文件格式是一个常用的归档与压缩标准&#xff0c;zipfile 模块提供了创建、读取、写入、添加及列出 …

如何通过QA质量管理提高软件质量?

1、构建了质量检查系统 为了保证软件开发质量&#xff0c;一般来说QA检查单按照检查阶段划分为&#xff1a;需求分析、系统设计、系统实现、系统测试、交付验收、系统运维。 QA质量管理&#xff1a;CoCode项目管理 QA质量管理——QA检查单​ 为了进一步提高检查效果&…

【笔记:第4课】学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春

文章目录前言来源正文小结前言 创作开始时间&#xff1a;2023年1月10日22:41:26 如题&#xff0c;学习一下RISC-V。 来源 https://www.bilibili.com/video/BV1Q5411w7z5?p4&vd_source73a25632b4f745be6bbcfe3c82bb7ec0 正文 操作系统&#xff1a;POSIX 标准。 LLVM有…

ArcGIS基础实验操作100例--实验80随机采样统计

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验80 随机采样统计 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

2022年度总结——一切都在慢慢变好

人生天地之间&#xff0c;若白驹过隙&#xff0c;忽然而已&#xff0c;每个人都希望留下自己的足迹。——题记日月两盏灯&#xff0c;春秋一场梦。回想一年前的现在我在干什么呢&#xff1f;去年的寒假我刚步入大学一个学期&#xff0c;迷茫彷徨&#xff0c;怅然若失&#xff0…

Promise处理异步的并行和串行

一、异步的“并行” 同时处理&#xff0c;相互之间没啥依赖 // 执行FN1返回一个promise实例&#xff0c;实例中管理了一个异步编程的代码&#xff0c;当定时器到时间后&#xff0c;才会把实例的状态改为成功 const fn1 () > {return new Promise(resolve > {setTimeou…