一种预编译容易出错的地方:
经常见到这样的一段程序:
1 /* file of aa.h*/
#ifdef XXX_MODULE_GLOBALS
#define XXX_EXT
#else
#define XXX_EXT extern
#endif
XXX_EXT unsigned char VAL1, VAL2......
// end of file of aa.h
2/* file of aa.c*/
#define XXX_MODULE_GLOBALS
#include aa.h
VAL1=...
VAL2=...
3/* file of bb.c.......*/
#include aa.h
VAL1=...
VAL2=...
总结:如果步骤二中
#define XXX_MODULE_GLOBALS
#include aa.h
这两句的顺序不是这样的而是:
#include aa.h
#define XXX_MODULE_GLOBALS
编译器就会报错:变量未定义,所以一定要注意顺序。
其实也可以直接将模块对外输出的变量;也放在xx.h中这样比较整齐,,但是也容易出现不需要引脚的变量也引用了,但编译是否会报错还未可知。
二 通过 #undefine 限定宏只在file_AAA.c中

1 /////////////////////////////////////////////////////// 2 /*file_AAA.h*/ 3 #ifndef _EXTERN_ 4 #define _EXTERN_ extern 5 #endif 6 7 _EXTERN_ int16_t g_AAA_Val; 8 ////////////////////////////////////////////////////// 9 10 /*file_AAA.c*/ 11 12 #define EXTERN 13 #include "file_AAA.h" 14 #undefine EXTERN 15 //////////////////////////////////// 16 /*file_BBB.c*/ 17 #include "file_AAA.h"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?