本文讲述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
以及抖音:口渴的鱼