C语言中 .c 和 .h 文件的关系及作用解析
在嵌入式开发中,通常会使用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 使用定义好的函数。