🌞欢迎来到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 "”。