一句话解释
#ifndef __AGRI_CONFIG_H__
#define __AGRI_CONFIG_H__
// 你的代码
#endif
这三行的作用只有一个:
防止头文件被重复包含(重复编译),避免报错!
逐行翻译(超级通俗)
1. #ifndef __AGRI_CONFIG_H__
if not define → 如果没有定义过
意思:
如果之前没定义过 __AGRI_CONFIG_H__ 这个名字,就继续往下编译。
2. #define __AGRI_CONFIG_H__
定义一下 __AGRI_CONFIG_H__ 这个名字
作用:
标记一下:这个头文件我已经编译过了!
3. #endif
结束判断
合起来的逻辑(人话版)
如果这个头文件第一次被包含 → 编译里面的内容
如果这个头文件已经被包含过 → 跳过,不编译
这就叫:头文件保护(Include Guard)
为什么必须写?
因为你项目里 很多 .c 文件都会 #include “agri_config.h”
如果不加这三行 → 头文件被重复包含 → 编译器报错:
- 重复定义
- 重复声明
- 结构体重定义
- 函数重定义
加了就 100% 不会重复编译。
命名规则(必须记住)
__文件名全大写_H__
例子:
agri_config.h→__AGRI_CONFIG_H__sht40.h→__SHT40_H__fan.h→__FAN_H__agri_status.h→__AGRI_STATUS_H__
前后两个下划线 + 全大写 + 下划线分隔 + 最后 H__
标准模板(你直接复制)
#ifndef __AGRI_CONFIG_H__
#define __AGRI_CONFIG_H__
// 这里放结构体、宏定义、函数声明
#endif
终极总结(最关键)
#ifndef 三行 = 头文件的防盗门,防止重复编译!
所有 .h 头文件必须写!
你现在懂了吗?不懂我再用更简单的比喻讲~