【C语言】模块化编程-通俗易懂

article/2025/8/22 10:44:12

1什么是模块化

模块化编程就是把我们的一整个项目,分成很多模块(比如一个学生成绩查询可以分为,登陆,查询,修改保存,退出等模块)

而一个程序工程包含多个源文件(.c 文件和 .h 文件),每个 .c 文件可以被称为一个模块,每一个模块都有其各自的功能,而每一个.h文件则是声明该模块,相当于功能说明书   模块化编程在嵌入式中为必须要掌握的技能

2为啥要用模块化

有的同学会想,我一个main.c也写得津津有道的,为什么偏要分开呢。

在我们实际应用中,当你的代码长度长起来了以后就会发现,想自己以前的代码里面找到之前定义的模块很麻烦,因为代码太多太繁杂了,你很难有一个清晰的分类,这就导致了代码的臃肿性,并且别人也很难看懂你的代码。

并且在实际项目开发的时候,一个复杂的项目意味着你需要和别人组成小组一起进行开发,这时候每个人负责一部分功能的开发,而你所负责的模块,你需要将你负责的模块功能写好,封装好,之后形成一个.c与.h  然后交付给项目组长,组长则负责整体框架(main)的编写与各个模块的组合调试,最后各个模块的组合,形成了整个工程。

这时候就可以彰显模块化的作用了,它使得整个项目分工明确,条理清晰,易于阅读,便于移植,等优点


 

模块化具体原理:

我们在写C语言代码的时候,首先做的就是引入头文件

在相对应的头文件引入之后,就可以使用相对应头文件里的函数,

比如    #include<stdio.h>

之后我们就可以使用printf scanf 语句进行数据的打印与获取,而printf和scanf语句的定义则是在stdio.h中,用户只需要负责调用即可

 

模块化编程的核心思想也正是如此:     将系统的各个功能进行封装,变成一个个独立的模块,其他人只需要使用你所提供的函数和变量等,就可以完成相对应的功能

模块化的本质也就是,新建一个.c和.h文件,

.c文件里面存放着你所构建的函数,功能,等等,而当你想让他可以被其他文件使用时,这时候便需要在对应的.H之中声明,

在外部调用时,只需要#include包含相对应的.h  即可

 

具体可以阅读:【C语言】----宏定义,预处理宏

3模块化基本代码实现:

我们以最简单的LED为例  ,将其分为一个模块

LED.h

#ifndef LED.h#define LED.hextern void LED_Open();   //开启LED灯 extern void LED_Close();  //关闭LED灯#endif

LED.c

void LED_Open(){//亮灯代码}
void LED_Close(){//关灯代码}

main.c  主函数

#include "LED.h"int main(void)
{    LED_Open();  //开启LED灯while(1);
}

这样子你的LED部分的代码就会独立起来,需要使用时直接调用函数即可,修改也会变得十分简便

模块化的核心也就是各个模块独立封装,多个.c和.h 使得整个工程变得易于阅读,逻辑清晰

我们分布讲解

首先

#ifndef XXX   表示如果没有定义    xxx 则执行后面的语句 如果已经定义则不执行,

#define   xxx   定义一个预处理宏定义,

#endif   表示条件命令的结束   

我们这里#ifndef LED.h     #define LED.h 表示如果没有定义LED.H这个头文件,则定义LED.h  并且后面的语句都有效,直到#endif 结束命令为止

同时声明了开LED灯和关LED灯两个函数

 

具体格式为:


#ifndef _XXX_h_#define _XXX_h_#endif

.c文件中:

#include "XXX.h"

 

.C文件

之后LED.c文件则是你所构建的函数,完成函数功能的编写,和变量的定义

最后在主函数或者其他函数中 #include LED.h  包含头文件,即可调用相对应声明的函数和变量

 

这便是一个模块的构建,而构建多个模块实现其各自功能,并且在主函数中分别调用,这便是模块化编程

 

 

 

比如我想要建立一个学生成绩管理系统,就可以分成几个模块,分别建立相对应的.c文件和.h文件,最后在主函数中调用相对应功能即可

 

 

c语言中条件编译相关的预编译指令

#define            定义一个预处理宏
#undef            取消宏的定义

#if                   编译预处理中的条件命令,相当于C语法中的if语句
#ifdef              判断某个宏是否被定义,若已定义,执行随后的语句
#ifndef            与#ifdef相反,判断某个宏是否未被定义
#elif                若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,相当于C语法中的else-if
#else              与#if, #ifdef, #ifndef对应, 若这些条件不满足,则执行#else之后的语句,相当于C语法中的else
#endif             #if, #ifdef, #ifndef这些条件命令的结束标志.
defined          与#if, #elif配合使用,判断某个宏是否被定义

具体可以阅读:【C语言】----宏定义,预处理宏

 

4模块化编程注意事项

 

头文件(XX.h)注意事项:

1.函数默认是extern属性 也就是我们声明函数的时候前面的extern可有可无

extern void LED_Open();   void LED_Open();   //相同

2.“.h”文件中不可以定义变量  在.h中只能声明,不能定义

#ifndef LED.h
#define LED.hextern a;  //声明变量a  正确
b=3;        //定义变量b  错误#endif

3声明变量不会占用内存,定义变量才会

定义变量和声明变量的区别在于定义会产生分配内存的操作,这是汇编阶段的概念;声明则只是告诉包含该声明的模块在连接阶段从其他模块寻找外部函数和变量。

 

4 不想让外界知道的信息,就不应该出现在头文件里,而想让外部调用的函数或变量,则一定要在头文件中声明

 

5  头文件(.h)命名应与源文件(.c)一致,便于清晰的查看各个头文件

 

6 #include <stdio.h>,#include "myfile.h",双引号先在工程目录里寻找,再去系统目录里寻找。

 

.c文件(XX.c)注意事项:

1.模块内不想被外部引用的函数和全局变量需在“.c”文件头冠以static关键字声明。  这样这些函数和变量只会在当前.c文件中起到作用一来可以避免函数名的重复;二来可以保护内部的实现数据,防止被破坏

static a = 3;
static void LED_Open();   

 

2模块中想要被其他文件访问的变量,一定要是全局变量,并且在.h中声明

 

要尽量减少全局变量的使用,因为全局变量的生命周期是从程序的开始到程序的结束的,这意味着你在其他源文件中调用这个变量时,可能会产生同名变量,以及变量数值错误等问题

 

4函数的声明有无extern都行,变量的声明必须加上extern,否则编译器无法识别声明。

 

extern static 关键字用法 请参看 【c语言】关键字存储类型讲解(auto,extern,static,register,const)


http://chatgpt.dhexx.cn/article/piaobKT8.shtml

相关文章

python模块详细介绍

文章目录 模块模块的简介和使用简介使用模块 python标准库python第三方模块pyecharts的使用 模块 模块的简介和使用 简介 模块化是将程序分解为一个个的模块module&#xff0c;通过组合模块来搭建出一个完整的程序。 有点&#xff1a;便于团队开发&#xff0c;方便维护&…

什么是模块化?

1.什么是模块化? 1.模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元 2. 编程领域中的模块化&#xff0c;就是遵守固定的规则&#xff0c;把一个大文件拆成独立并互相依赖的多个小模块…

模块的介绍

模块简介 1.什么是模块 模块就是以 .py 结尾的文件里面定义好功能的函数和对象看成一个结合体&#xff0c;当用户调用模块就相当于拥有了这个模块里面的所有功能。 2.模块的分类 内置模块&#xff1a; 解释器内自带的模块 可以直接调用 如&#xff1a;time、random 自定义模块&…

模块基础——模块简介、模块导入方式、模块查找顺序

文章目录 模块简介模块的使用import句式from...import...句式模块的补充知识判断文件类型循环导入问题模块的查找顺序(重点) 面向过程编程面向过程的优缺点 模块简介 什么是模块&#xff1f; 模块就是一系列功能的集合。在python中&#xff0c;一个py文件就是一个模块&#xff…

Linux下iptables防火墙配置

目录 一.Linux防火墙基础 1.1 防火墙概述 1.2 四表五链 二. iptables--命令 2.1 iptables的安装 2.2 iptables的配置方法 三.配置Filter表防火墙 3.1 列出&#xff08;fliter&#xff09;表中的所有链 iptables -L 3.2 使用数字形式&#xff08;fliter&#xff09;表…

linux防火墙添加开放端口

linux防火墙添加开放端口 --添加开放端口 sudo firewall-cmd --zonepublic --add-port开放的端口号/协议[tcp/udp] --permanent --permanent 添加的端口号永久生效 --使新增的端口配置立即生效 sudo firewall-cmd --reload ​​​​​​​

Linux修改防火墙

linux环境-CentOS 7.6 64位 查看是否配置防火墙&#xff1a;ifconfig 2.查看是否开启防火墙&#xff1a;service iptables status 3.查看防火墙配置规则&#xff1a;iptables -L -n 4.查看ssh当前端口占用&#xff1a;sudo netstat -atlunp | grep sshd 5.修改进入ssh目录&a…

linux 防火墙配置规则

基础知识 Linux系统内核内建了netfilter防火墙机制。Netfilter&#xff08;数据包过滤机制&#xff09;&#xff0c;所谓的数据包过滤&#xff0c;就是分析进入主机的网络数据包&#xff0c;将数据包的头部数据提取出来进行分析&#xff0c;以决该连接为放行或阻挡的机制。Net…

Linux防火墙配置及放行端口

文章目录 一、firewalld的基本使用&#xff08;系统防火墙&#xff09;二、配置firewalld-cmd三、通过firewall-cmd&#xff08;放行端口&#xff09; 一、firewalld的基本使用&#xff08;系统防火墙&#xff09; 查看防火墙状态&#xff1a; systemctl status firewalld.se…

linux显示 防火墙配置文件,怎么查看Linux防火墙配置方法

当Linux系统的防火墙的状态和信息时候,我们可以用哪些命令查看呢。下面由学习啦小编为大家整理了查看Linux系统防火墙的命令详解,希望对大家有帮助! 查看Linux系统防火墙的命令详解 查看Linux系统防火墙的命令一、service方式 查看防火墙状态: [root@centos6 ~]# service ip…

Linux 配置防火墙

Linux 配置防火墙 一、图形化的形式 1.开启LAMP systemctl start httpd2.查看本地IP地址 ip addr3.本地IP为 192.168.31.150本地访问 外部浏览器就无法访问 4.此时配置防火墙 firewall-config此时&#xff0c;出现图形化界面&#xff0c;需要输入密码 改变服务http R…

Linux 防火墙配置(iptables和firewalld)

目录 防火墙基本概念 Iptables讲解 Iptables表 Iptables规则链 Iptables控制类型 Iptables命令配置 firewalld讲解 Firewalld区域概念 Firewalld两种配置方法 firewall-cmd命令行基础配置 firewall-config图形化配置 防火墙基本概念 防火墙就是根据系统管理员设定的…

UI设计师如何应对面试 哪些细节问题不可忽视

UI设计师如何应对面试&#xff1f;哪些细节问题不可忽视&#xff1f;有互联网的地方就会有UI设计师&#xff0c;越来越多的人转行从事UI设计加剧了求职竞争&#xff0c;如何才能脱颖而出获得高薪呢?专业技能很重要&#xff0c;面试技巧也不可忽视&#xff0c;下面就给大家分享…

UI设计师如何脱颖而出 面试过程中要注意什么

UI设计师如何脱颖而出&#xff1f;面试过程中要注意什么&#xff1f;有互联网的地方就会有UI设计师&#xff0c;越来越多的人转行从事UI设计加剧了求职竞争。专业技能很重要&#xff0c;面试技巧也不可忽视&#xff0c;下面就给大家分享一些UI设计师在面试过程中不可忽视的四个…

UI设计师这些面试技巧你知道吗?

随着互联网产业的飞速发展&#xff0c;UI设计师岗位缺口不断攀升&#xff0c;有意入行的人群也不在少数。那么学成之后&#xff0c;自然而然要进入到面试环节&#xff0c;为了提前做好准备&#xff0c;千锋今天向您分享几招UI设计师的面试技巧。 ​ 通顺的逻辑思维和表达能力 …

企业招聘UI设计常见面试题分享

对于想要加入互联网行业却又不愿意敲代码的人来说&#xff0c;UI设计是一个非常不错的选择。随着用户体验度即审美要求的提升&#xff0c;UI设计师地位进一步提升&#xff0c;很多企业都乐意薪资较高的招聘专业的设计人才。下面就给大家详细介绍一下。 目前UI设计热度呈现持续上…

2018年UI设计师经典面试题及答案总结

2018年马上就要结束了,给大家总结了一些UI设计出现比较多的面试题,很多时候我们有足够的技术,但是可能就断送在了面试上,大家如果去面试,可以多了解看看以下的这些UI设计师经典面试题及答案,毕竟知己知彼才能更好的发挥自己的特长,提高面试的机率嘛。 1、推动一个项目的…

android ui设计 面试问题,2019新版UI设计面试题汇总附答案

原标题&#xff1a;2019新版UI设计面试题汇总附答案 问题一、Android手机的常用设计尺寸有_________.怎么适配ios和安卓。 答案&#xff1a;安卓320 X 480是常规模拟器、但现在的开发都是用360x640做一倍率。480 X 800(1.5倍率)、720 X 1280(2倍率)、1920*1080(3倍率) ios用ske…

2019UI设计岗位最常见的面试题

UI作为门槛较低的互联网职业&#xff0c;每天都有很多人涌进UI设计行业&#xff0c;其实UI设计行业结构是和传统行业是一样的&#xff0c;不缺新人&#xff0c;或者水平一般的人&#xff0c;但是要成为技术娴熟却不容易。 而且并不是说你会了个工作流程&#xff0c;就很牛了。…

UI设计师作品准备以及面试攻略

链接:https://www.jianshu.com/p/a3ba265998fa 引言 众所周知设计师的面试分两个部分&#xff0c;一个是作品集&#xff0c;一个是面试过程。作品集是敲门砖&#xff0c;也是面试过程中贯穿全程的内容&#xff0c;如果你的作品集只有70分&#xff0c;那么你可以通过面试让自己…