C语言:#ifndef、#define、#endif-防止头文件被重复包含(重复编译)

一句话解释

#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 头文件必须写!

你现在懂了吗?不懂我再用更简单的比喻讲~