#ifndef FLOW_EXT #define FLOW_EXT extern

张开发
2026/4/20 21:10:57 15 分钟阅读

分享文章

#ifndef FLOW_EXT #define FLOW_EXT extern
.c 文件里面#define FLOW_EXT .h文件里面#ifndef FLOW_EXT #define FLOW_EXT extern #endif FLOW_EXT u16 t_boundary_1s; 怎么理解1. 在 .c 文件中c// source.c #define FLOW_EXT // 定义 FLOW_EXT 宏值为空 #include header.h // 此时头文件中的代码会这样展开...2. 在 .h 文件中h// header.h #ifndef FLOW_EXT // 检查 FLOW_EXT 是否未定义 #define FLOW_EXT extern // 如果未定义定义为 extern #endif FLOW_EXT u16 t_boundary_1s; // 使用 FLOW_EXT 修饰变量关键展开结果不同情况1在定义了FLOW_EXT的 .c 文件中c// FLOW_EXT 已定义值为空所以跳过 #define // 直接执行FLOW_EXT u16 t_boundary_1s; // 展开为(空) u16 t_boundary_1s; // 最终u16 t_boundary_1s; ← 这是变量定义分配内存情况2在未定义FLOW_EXT的其他 .c 文件中c// FLOW_EXT 未定义执行 #define FLOW_EXT extern // 然后FLOW_EXT u16 t_boundary_1s; // 展开为extern u16 t_boundary_1s; ← 这是变量声明不分配内存完整示例global.hh#ifndef GLOBAL_H #define GLOBAL_H typedef unsigned short u16; #ifndef FLOW_EXT #define FLOW_EXT extern #endif FLOW_EXT u16 t_boundary_1s; // 魔法在这里 #endifmain.c定义变量的文件c#define FLOW_EXT // 关键先定义这个宏 #include global.h // 经过预处理后上面那行变成 // u16 t_boundary_1s; ← 实际定义变量分配内存 void main() { t_boundary_1s 100; // 可以直接使用 }other.c使用变量的文件c// 不定义 FLOW_EXT #include global.h // 经过预处理后上面那行变成 // extern u16 t_boundary_1s; ← 只是声明不分配内存 void func() { t_boundary_1s 200; // 引用 main.c 中定义的变量 }核心理解文件FLOW_EXT 状态宏展开实际代码作用main.c#define FLOW_EXT空u16 t_boundary_1s;定义分配内存other.c未定义externextern u16 t_boundary_1s;声明引用外部为什么这样设计传统方式需要维护两处h// 需要在头文件和源文件分别声明 extern u16 t_boundary_1s; // .h文件 u16 t_boundary_1s; // 某个.c文件这种技巧的优势✅单一维护点只需在头文件中写一次变量声明✅自动区分通过#define FLOW_EXT控制是定义还是声明✅防止重复定义只有一个文件会实际定义变量✅代码清晰明确哪个文件是变量的所有者这是一种优雅的全局变量管理技巧在嵌入式系统和大型C项目中很常见

更多文章