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

  • Post author:
  • Post category:其他


本文讲述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

以及抖音:口渴的鱼



版权声明:本文为oJinGangZuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。