从stm32库函数看全局变量 .h文件的组织形式

1.前文

在使用keil5写代码的时候,经常会有模块化的思想,将我们的函数封装为一个一个的模块来使用,但在使用的过程中,常常会有.h文件的配置和extern声明放置的问题。

而在正点原子的keil5代码中,在.h文件中实现结构体变量的创建,并在.h文件中实现全局变量的声明

而在.c文件中实现了变量的定义

那为什么会是这一种配置呢?其中很大的原因就是可读性和便捷性,.h文件就像是一篇文章的summary或者可以说是catalog,是一个库函数的接口

在.h文件中给出了一个.c文件的所有变量的定义,当编译器需要时,会通过.h->.c文件的方式来实现函数的调用。而.c文件中常常会拥有很多变量,有静态的变量,有全局的变量还有生存周期只在一个函数体内部的变量。而这么多变量的种类中,有的变量是希望用户能访问到的,有的则是不希望用户访问的。

所以,那些希望用户访问的变量会在.h文件中进行外部声明,而其他不希望用户访问的,则在.h文件中是不会出现的。

2.分析

接下来我们以正点原子给出的USMART调试试验一节为例,来一起分析下,正点原子的库函数封装的组织形式

上图是main.c文件,是主函数文件,而用红框圈出来的就是正点原子的库函数头文件

当我们进入这个头文件,我们可以将这个头文件分为以下几个部分:

1.引用的头文件

2.define宏定义

3.struct变量的定义

4.外部变量的声明

5.函数声明

接下来我们对几个部分依次说明

1.为什么要在usmart.h这个头文件中再加入其它头文件,其中的原因就是方便函数的声明和调用。如果我们点进去usmart_str.h这个头文件,我们会发现,头文件里面是很简单的两个部分:#include "stm32f10x.h"和函数的声明。

进行这样的重复引用之后,我们函数的调用就更加快捷和方便,比如说,我们只要使用#include "usmart.h"就可以同时调用usmart.c和usmart_str.c这两个.c文件之中的函数,而不需要另外#include "usmart_str.h",这大大降低了我们的工作量。

2.宏定义很简单,不多说了,但值得注意的是,如果要使用这些宏定义,则必须得先#include "usmart.h",因为这些宏是定义在.h文件中,相比传统的将宏定义在.c文件中,这种方法大大降低了工作量。举个例子,比如现在你有一个宏定义:#define pi 3.14,而你在你的main.c文件中和库函数文件中都要用到这一个宏定义,这时你有两种方法可以选择:

1)最传统的方法,在两个.c文件的头部依次加上#define pi 3.14

2)在一个.h中加上#define pi 3.14,然后在两个.c文件中同时引用这个.h文件

显然第二种方法更加简单,而且随着宏定义数的增加和这种优势会更加的明显

3.struct变量的定义也同第二点大同小异,是降低工作量的一种小技巧,将结构体变量的定义放在.h文件也更加方便了我们阅读

4.外部变量的声明,正如我们上文所讲到的,.h文件是一个接口,是与用户通信的接口,而外部变量的声明是希望其他人可以访问到这两个变量,具体效果就是:在我们的usmart.c和usmart_str.c这三个文件中都可以访问到这两个变量,实现了我们的一个信息的传递

5.函数定义很简单,就不多讲了

一般而言一个.c是对应一个.h文件,为什么在正点原子的例程之中,没有usmart_config.c所对应的。h文件呢?

其很大的一个原因是因为usmart_config.c太过简单了,里面只定义了两个全局变量,所以正点原子选择将这个.h文件合并到usmart.h这个文件之中了,我们也可以单独创建一个.h文件,如下图

然后修改usmart.h文件

可以看出我们的编译是正常通过的

3.总结

总而言之,写代码的功底实力都是得靠代码阅读量,而非一两篇文章的总结就能提升的,祝好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值