C语言头文件定义技巧以及注意事项_头文件引用一个类定义时,尽量,2024年最新物联网嵌入式开发进阶

87 阅读3分钟

假定我们有如下几个文件:
key.h的内容如下:

#ifndef \_\_KEY\_H\_\_
#define \_\_KEY\_H\_\_

#ifdef \_\_cplusplus
extern "C" {
#endif /\* \_\_cplusplus \*/

#define KEY\_DOWN 0x0001 //按键按下
#define KEY\_UP 0x0002 //按键弹起

#ifdef \_\_cplusplus
}
#endif /\* \_\_cplusplus \*/

#endif

led.h的内容如下:

#ifndef \_\_LED\_H\_\_
#define \_\_LED\_H\_\_

#ifdef \_\_cplusplus
extern "C" {
#endif /\* \_\_cplusplus \*/

#define LED\_GREEN 0x0001 //绿色led
#define LED\_RED 0x0002 //红色led

#ifdef \_\_cplusplus
}
#endif /\* \_\_cplusplus \*/

#endif

在main.c文件里面,我需要引用两个变量,KEY_DOWN和 LED_RED,那么我们就要如下方式使用:

#include "config.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdint.h>
#include "stm32f10x.h"
#include “led.h” //引用宏LED\_RED
#include “key.h” //引用宏KEY\_DOWN

int main(void)
{
	int key;
	while(1)
	{
		key = GetKey();
		if(key == KEY_DOWN)
		  LedOn(LED_RED);
		delay(10);
	}
}

单独从这几个文件来看,这是正确的处理方式,也没有任何毛病。但是我们延伸一下,假如我们要引用的头文件更多呢?比如很多全局的宏定义,变量定义等等,那么我们就要在c文件前面罗列一大堆文件来表明我们的引用来源。
更好的解决办法是我们定义另外一个头文件,把项目全部的头文件(有时候可能极个别例外)都按照一定顺序放到这个文件里面,在其他的c文件前面只需要放一个这个头文件就可以了。
比如定义一个header。h

   ```c
#ifndef \_\_LED\_H\_\_
#define \_\_LED\_H\_\_

#include "config.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdint.h>
#include "stm32f10x.h"

#include “led.h”
#include “key.h”
#endif

在C文件里面就修改为如下,这样是不是看起来清爽多了:

#include "header.h"

int main(void)
{
	int key;
	while(1)
	{
		key = GetKey();
		if(key == KEY_DOWN)
		  LedOn(LED_RED);
		delay(10);
	}
}

当然,在这样处理的过程中我们要注意几个地方:
1.header.h里面的头文件要安照引用的先后顺序排列,只能后面文件里面的引用前面的文件里面的定义,不可以颠倒过来引用。
2.每一个头文件前面都要有防止重复引用的标识符号定义,如#define KEY_H
在头文件定义的过程中,我们使用了两个技巧:
技巧一:

#ifndef \_\_LED\_H\_\_ //检查是否定义宏\_\_LED\_H\_\_
#define \_\_LED\_H\_\_ //如果没有定义,就定义一个宏
//#ifndef和#endif是配对使用的,在这之间的代码只有在\_\_LED\_H\_\_宏没有被定义的时候才会被编译进去,否则会忽略掉。
#endif

在每一个头文件的最开始,声明了一个和文件名称一样的标识宏(建议这样定义宏名称,以保持整个项目里面宏名字的唯一性),起什么作用呢?

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取