文章讲述了在嵌入式开发中,C语言的源代码通常分为.c和.h文件。.c文件包含函数实现和变量定义,而.h文件包含函数声明和结构体定义,作为接口供其他模块使用。头文件通过预处理器的宏防止重复包含,确保编译正确性。文中通过LED控制的例子,展示了如何编写和使用.h及.c文件。
在嵌入式开发中,通常会使用C语言编写程序。C语言的程序通常被分成两个文件:.c文件和.h文件。
一、是什么 ?
1 .c文件包含了程序的实现部分,其中包含了函数的实现和变量的定义等内容。.c文件是可以被编译成可执行文件的。
2 .h文件包含了程序的接口部分,其中包含了函数的声明和结构体的定义等内容。这些代码不是可执行代码,而是提供给其他模块使用的接口。其他模块可以导入这些头文件,并通过调用头文件中声明的函数和定义的结构体来与该模块进行交互。
因此,.c文件和.h文件是相互关联的。通常,每个.c文件都对应一个.h文件。
二、怎么做 ?
1. 先编写 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
2. 在 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;
}
3. 在 main.c 中导入 led.h,使用定义好的接口:
#include "led.h"
int main(void)
{
// 打开 LED
led_open();
return 0;
}
总结
先编写 led.h;
再编写 led.c;
在mian.c 或其他文件中导入 led.h 使用定义好的函数。