本文讲述C语言多文件编译的精神内核,语法规则,应用场景等知识,旨在帮助初学者了解软件工程基本原理,多文件编译的优势和必然,从而更好的开发出可维护性更高,复杂度更高的有效程序。

一、为什么要多文件?

想回答这个问题,首先要知道函数的作用

我们都知道,C语言的核心单元是函数。它将能够实现一定功能的代码段封装起来,实现复用,极大提升了代码的开发效率。一个C语言的文件就是多个函数的组合。

函数的另一个好处是,责任划分。现代软件工程在开发过程中,不再依靠个人英雄主义式的单人开发模式,而是多人合作编程,实现更为复杂的功能软件。只要涉及到多人合作完成的事情,就一定要做好分工和责任划分。这不单是软件行业的问题。这适用于所有需要多人合作的行业。我们也可以简单把他归结为:工程化。

软件的工程化就是软件工程主要研究的课题。它研究如何以工程化的原则,原理和方法,指导软件的开发,尤其是多人合作的软件开发。它研究这些合作者如何分工,如何各司其职;它研究软件的生存周期,它研究软件的开发模型。

当系统功能复杂,开发人员众多,就需要每个人员分工,做好自己的一部分程序。从大型软件开发的角度,软件需要划分不同的功能模块。从C语言开发小型软件的角度。可以简化为:将完成一类功能的函数归档为一个文件的方式,形成多个文件,交由不同的开发人员合作完成。也就形成了多文件编译的形态。

二、C语言多文件编译的文件类型和含义

C语言编写控制台程序的多文件结构主要有三类文件。

(1)主程序文件。

该文件实现程序的主要执行逻辑,是整个程序的核心业务逻辑的实现,是一个源码文件,后缀为.c,通常情况下是main函数所在文件。

(2)功能函数文件。

这一类文件可能不只一个,每一个功能函数文件都围绕着一类(一种)功能展开,近似于一个模块的概念。 每一个文件往往由一个程序员来完成,里面包含一个或若干个功能函数。

(3)头文件。

这一类文件存放的是项目相关设计层面的程序逻辑。例如,一个自定义数据类型(结构类型),设定好的函数的声明,又叫函数头。这也是为什么这个文件叫头文件的一个原因之一。任何函数实现的逻辑都不要放到头文件中。因为头文件更像是一个使用说明书,通过头文件阅读,读者可以更快的了解系统模块的划分和函数的设计,功能的阐述。

三、多种角色如何配合实现多文件编译

要实现多文件编译,需要至少两个角色。如果是你自己,那么请你一人分饰两角,来完成这次多文件编译。

角色一:项目总调度(总设计师)

该角色能够总揽全局,对项目了解透彻,能够划分功能模块。

他要完成的工作是:

(1)设计项目程序执行的主逻辑,编写主程序文件。在C语言编写的小型MIS系统中,往往简化为主函数。可以存放在主程序文件main.c中。

(2)划分模块,并编写头文件。在C语言中,需要在头文件中给出自定义数据结构的声明(如结构类型),各个功能函数的函数原型声明(或者叫函数头)。

角色二:软件工程师(一线程序员)

该角色根据总设计师对项目的设计,进行相应功能模块中函数的代码实现。该角色可能不是一个人。当然,如果你一人分饰多角的话,那就是你自己。

他要完成的工作是:

依据总设计师写好的头文件中,关于数据结构的设计,以及功能函数的设计,完成自己所负责的功能函数的实现。

四、多文件编译实例

接下来举一个最简单的实例,来诠释多文件编译。

项目描述: 项目实现一个简易的计算器,完成两个整数的加减乘除四则运算。

第一步:总设计师设计项目数据结构,写出主程序逻辑和头文件。

本项目可以设计一个结构类型struct num用来存储两个操作数。设计add, dif, mul, div作为四则运算函数。设计主函数让用户输入表达式,完成四则运算的计算。

头文件calculator.h可以设计为:

//存放两个操作数的结构体类型
struct num
{int a;int b;
};//加法运算
int add(struct num op);//减法运算
int dif(struct num op);//乘法运算
int mul(struct num op);//除法运算
int div(struct num op);

主程序文件可设计为:、

#include<stdio.h>
#include"calculator.h"int main()
{struct num op; //两个操作数int result;    //结果char Operator; //操作符printf("please enter a formula like 1+2:\n");//用户输入算式scanf("%d%c%d",&op.a,&Operator,&op.b);//调用函数计算结果switch(Operator){case '+':result = add(op);break;case '-':result = dif(op);break;case '*':result = mul(op);break;case '/':result = div(op);break;default:printf("the operator is illegal\n");}//打印结果到屏幕printf("%d %c %d = %d", op.a, Operator, op.b, result);return 0;
}

第二步:软件工程师在于总设计师沟通后,根据总设计师提供的calculator.h文件进行函数的实现工作。

他们将编写自己负责的功能函数,并归纳到文件calculator.c中

如下列代码所示:

#include"calculator.h"
//加法运算
int add(struct num op)
{return op.a + op.b;
}//减法运算
int dif(struct num op)
{return op.a - op.b;
}//乘法运算
int mul(struct num op)
{return op.a * op.b;
}//除法运算
int div(struct num op)
{if(op.b == 0){exit(1);}else{return op.a / op.b;}
}

项目将含有三个文件,如图所示:

运行结果如下:

五、总结

多文件编译是软件工程发展的必然产物,是多人合作编程解决复杂问题的必经之路。初学者要了解多文件编译背后的机理和产生的软件工程背景,才能深刻领悟多文件编译的优点和必然性。从C语言开始,IT产业迈向了飞速发展的轨道。多文件编译模式功不可没,它让多人合作编程成为可能,并且更加高效。希望本文对于C语言初学者有所帮助。加油。

视频讲解请搜索bilibili:猎风工作室崔老师

【C语言多文件编译的基本原理和设计理念】 https://www.bilibili.com/video/BV1sW4y18732?share_source=copy_web&vd_source=75bceba5d7c6080fbc7cc4f6d257a90f

以及抖音:口渴的鱼

C语言多文件编译的精神内核-讲透多文件编译攻略相关推荐

  1. Python语言学习:创建/删除文件/文件夹、获取当前文件/文件夹路径(系统环境路径/目录)、获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略

    Python语言学习:创建/删除文件/文件夹.获取当前文件/文件夹路径(系统环境路径/目录).获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略 目录 系统环境路径的设置 1.sys ...

  2. Go:go语言的认识理解、安装应用、语法使用之详细攻略

    Go:go语言的认识理解.安装应用.语法使用之详细攻略 目录 go语言的认识理解 go语言的安装应用 硬件架构 操作系统 开发工具 go语言的语法使用 go语言的认识理解 Go语言是谷歌2009发布的 ...

  3. Python:利用python语言绘制多个子图经典案例、代码实现之详细攻略

    Python:利用python语言绘制多个子图经典案例.代码实现之详细攻略 目录 利用python语言绘制多个子图代码实现.经典案例 1.绘制多个子图框架 多个子图绘制的经典案例 1.绘制多个直方图 ...

  4. 【内核配置】六、修改内核自带的的LCD驱动源码并编译进内核 | 烧写到Mini2440__TD35 完整攻略...

    主   机:VMWare--Ubuntu-16.04.2-x64-100ask 开发板:Mini2440--256M NandFlash, 2M NorFlash, 64M SDRAM, LCD-TD ...

  5. windows文件关联、打开方式列表之修改注册表攻略

    这里全是修改注册表的方式.网上找了半天,有的仅有添加文件关联的方法,却没有添加到打开方式列表里面的方法:有的有添加到文件列表的方法,却是使用控制面板->文件夹选项的.好难得才找齐所有,从添加文件 ...

  6. 机动车c1科三考试语言灯光,科目三灯光模拟「语音+图解」,详细攻略送给你!...

    2017-05-25 11:38:04 考试前必须检查灯光是否复位,否则还没考就会直接挂掉,浪费一次考试机会. 科目三灯光模拟「语音+图解」,详细攻略送给你! 语音提示:下面将进行模拟夜间行驶灯光的考 ...

  7. mt管理器图片在哪个文件夹_mt管理器迷你世界的文件夹在哪里 | 手游网游页游攻略大全...

    发布时间:2018-03-06 迷你世界在哪里找钻石?钻石在迷你世界中可以用来做高级耐磨的武器和工具,属于比较稀缺的资源.很多玩家都抱怨钻石太少也太难找,下面小编就给大家讲解一下游戏中哪些地方有钻石, ...

  8. 基础IO(文件接口、安装内核源码超详细步骤图解、静态库与动态库)

    基础IO C语言的文件操作接口 fopen fclose fread fwrite fseek 系统调用文件接口 open close read write lseek 安装内核源码 文件描述符&am ...

  9. linux4.9编译内核,centos6编译linux-4.9内核启用bbr

    一.       BBR简介 bbr算法作为google出品的一套拥塞控制算法,致力于解决两个问题: 1.        在一定丢包率的网络上充分利用带宽 2.        降低网络链路buffer ...

最新文章

  1. tc溜溜865手机投屏卡_游戏物理外挂再升级!腾讯黑鲨游戏手机3S开箱体验
  2. 一文带你了解人工智能最新进展:AI从业者如何选择技术路线?
  3. 计算机模块测试题,模拟计算机基础模块测试题.doc
  4. ofo 深圳 java_[Android进阶]OFO首页实现小窥
  5. 使用lex与yacc词法语法工具进行简单的SQL语义检查
  6. bochs core教程linux,ubuntu14.04中安装配置bochs详解(二)
  7. iReport —— A4打印,只占纸张的一半,如何解决
  8. Redis学习总结(数据类型、持久化、事务、数据删除策略、主从复制、哨兵、缓存雪崩等)
  9. 计组——彻底搞懂cache主存映射以及cache容量的计算
  10. Windows 计算机上查看 DNS 缓存的方法
  11. 多个倒计时并行(拼团倒计时)
  12. 动态规划问题(凑硬币)理解总结
  13. 常耀俊老师经典《非人力资源经理的人力资源管理》课程
  14. 【NI Multisim 14.0原理图设计基础——元器件分类】
  15. TL-WR941N救砖记
  16. OpenCV-Python 调节摄像头分辨率及窗口位置大小
  17. python写的飞船游戏卡顿_关于pygame里让飞船连续移动的问题?
  18. 【GD32开发】一、GD32F103 TIMER0 PWM死区时间计算
  19. web css 苹方字体设置
  20. B19 - 999、大数据组件学习⑯ - ElasticSearch

热门文章

  1. Hive中使用sort_array函数解决collet_list列表排序混乱问题
  2. 共建“医疗合规科技实验室”,美创科技实力护航医疗数据安全
  3. 用matlab画同心圆,求同心圆的同心度
  4. 女神找我帮忙--图片转成手绘,该不该答应?
  5. c语言版贪吃蛇《课程设计》
  6. 前端canvas画海报
  7. 雀巢“可持续发展列车”驶入瑞士驻华大使馆
  8. 分享几款让你工作事半功倍的软件
  9. 项目实战:51单片机无线音乐门铃设计资料 五首歌曲自由切换 (含实物 图纸 程序 仿真)
  10. 华为WATCH 3手表怎么收能量,速领手表一键收能量