news 2026/5/21 3:58:07

#ifndef FLOW_EXT #define FLOW_EXT extern

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
#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.h

h

#ifndef GLOBAL_H #define GLOBAL_H typedef unsigned short u16; #ifndef FLOW_EXT #define FLOW_EXT extern #endif FLOW_EXT u16 t_boundary_1s; // 魔法在这里! #endif

main.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_EXTu16 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项目中很常见!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 3:57:40

从底层源码深入分析Bean的实例化

在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…

作者头像 李华
网站建设 2026/5/21 3:57:39

OpenClaw新手入门:Qwen3-14b_int4_awq模型快速上手指南

OpenClaw新手入门:Qwen3-14b_int4_awq模型快速上手指南 1. 为什么选择OpenClawQwen3组合? 上周我在整理电脑上的技术文档时,突然意识到一个问题:每次查找资料都要反复切换浏览器、文件夹和笔记软件,这种机械操作浪费…

作者头像 李华
网站建设 2026/4/21 20:09:33

ORB-SLAM3 Docker避坑全指南:从数据集下载失败到结果文件安全导出

ORB-SLAM3 Docker实战避坑手册:从环境配置到数据安全的全流程精解 1. 环境准备与Docker配置陷阱 在Docker中部署ORB-SLAM3时,90%的初学者都会在第一步就踩中隐藏的"地雷"。让我们先看一个典型的错误示范: # 危险示例:这…

作者头像 李华
网站建设 2026/4/22 7:27:57

流放之路Build规划终极指南:5个秘诀打造你的专属角色构建

流放之路Build规划终极指南:5个秘诀打造你的专属角色构建 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 还在为流放之路复杂的角色构建而头疼吗?…

作者头像 李华