在嵌入式开发中,通常会使用C语言编写程序。 C语言的程序通常被分成两个文件:.c文件和.h文件。
一、是什么 ?
.c文件包含了程序的实现部分,其中包含了函数的实现和变量的定义等内容。.c文件是可以被编译成可执行文件的。
.h文件包含了程序的接口部分,其中包含了函数的声明和结构体的定义等内容。这些代码不是可执行代码,而是提供给其他模块使用的接口。其他模块可以导入这些头文件,并通过调用头文件中声明的函数和定义的结构体来与该模块进行交互。
因此,.c文件和.h文件是相互关联的。通常,每个.c文件都对应一个.h文件。
二、怎么做 ?
- 先编写 led.h
- // 当一个头文件被多次包含时,预处理器会将该头文件的内容复制到每个包含它的源文件中。
- // 如果一个头文件被重复包含多次,就会导致重复定义的问题。
- // 当第一次包含头文件时,头文件保护宏被定义,后续再包含头文件时,头文件保护宏已经被定义,预处理器会直接跳过头文件的内容。
- // 头文件保护宏可以确保头文件只被包含一次,避免重复定义问题,同时也提高了编译速度
- #ifndef LED_H
- #define LED_H
- // 定义 LED 状态
- typedef enum {
- LED_OFF = 0,
- LED_ON // 不赋值,会根据第一个值计算为 1
- } LedStatus;
- // 打开 LED
- void led_open(void);
- // 关闭 LED
- void led_close(void);
- #endif
复制代码
- 在 led.c 实现 led.h 中定义的接口,或引用定义好的结构体,宏,枚举等
- #include "led.h"
- // 定义 LED 状态变量
- static LedStatus led_status = LED_OFF;
- // 打开 LED
- void led_open(void)
- {
- led_status = LED_ON;
- }
- // 关闭 LED
- void led_close(void)
- {
- led_status = LED_OFF;
- }
复制代码
- 在 main.c 中导入 led.h,使用定义好的接口
- #include "led.h"
- int main(void)
- {
- // 打开 LED
- led_open();
- return 0;
- }
复制代码
总结
- 先编写 led.h;
- 再编写 led.c;
- 在mian.c 或其他文件中导入 led.h 使用定义好的函数。
|