导致 KEIL error #20 的一种情况
> 描述
<+> 环境为 KEIL5.20 & STM32F429工程,平台为 win10
<+> 结构体原形如下
@File <A.h>
#include "all.h"
1 /* Define the GPS structure ---------------------------------------------------------------------*/ 2 typedef struct 3 { 4 uint32_t alarm_flag; /* ±¨¾¯±êÖ¾ */ 5 uint32_t status; /* ״̬ */ 6 uint32_t latitude; /* ά¶È */ 7 uint32_t longitude; /* ¾¶È */ 8 uint16_t elevation; /* º£°Î */ 9 uint16_t speed; /* ËÙ¶È */ 10 uint16_t direction; /* ·½Ïò */ 11 uint8_t GMT8[6]; /* GMT+8 YY-MM-DD-hh-mm-ss */ 12 }GPS_data_s; 13 14 typedef struct GPS_tpye 15 { 16 uint8_t msg_head; /* ÏûÏ¢±êʶͷ */ 17 uint16_t msg_ID; /* ÏûÏ¢ ID */ 18 uint16_t msg_prop; /* ÏûÏ¢ÌåÊôÐÔ */ 19 uint8_t term_phone[6]; /* ÖÕ¶ËÊÖ»úºÅ */ 20 uint16_t msg_SwiftNum; /* ÏûÏ¢Á÷Ë®ºÅ */ 21 GPS_data_s sMessage; /* ÏûÏ¢Ìå */ 22 uint8_t msg_CRC; /* УÑéÂë */ 23 uint8_t msg_tail; /* ÏûÏ¢±êʶβ */ 24 }GPS_package_s; 25 26 /* Define single union control bytes output */ 27 typedef union 28 { 29 GPS_package_s sGPS_obj; 30 uint8_t GPS_byte[sizeof(GPS_package_s)]; 31 }GPS_package_u;
<+> 引用类型源文件如下
@File <B.c>
#include "B.h"
1 void GMT8_to_BCD(GPS_RESULT_s *SrcObj, GPS_package_s *DesObj) 2 { 3 uint8_t i; 4 5 for(i = 0; i < 6; i++) 6 { 7 dec_to_BCD(*(&SrcObj->GMT8.year + i), &DesObj->sMessage.GMT8[5-i], 2); 8 } 9 10 }
@File <B.h>
#include "all.h"
1 void GMT8_to_BCD(GPS_RESULT_s *SrcObj, GPS_package_s *DesObj);
<+> 集合头文件 (为方便引用,all.h文件中包含了所有其他文件的头文件)
1 #include "A.h" 2 #include "B.h"
> 问题
<+> B.c文件中使用A.h文件中定义的结构体类无问题
<+> 在B.h文件中引用A.h文件中定义的结构体就会报错 error: #20: identifier "GPS_package_s" is undefined
> 分析
<+> 查看了提示未定义的那个标识符,确实是在A.h文件中定义了的,但这就很奇怪了
<+> 是不是由于头文件 include "all.h",导致头文件包含了自身而出现了错误
<+> 是否为不支持别名类(即typedef定义的)
<+> ...
> 解决
<+> 将头文件 "all.h" 中的 include "B.h" 去掉,可编译无错
<+> 将类别名 GPS_package_s 替换为原类 struct GPS_type,可编译无错
> 总结
<+> 以上两种解决方法只是治标不治本,本质原因未解决
<+> 猜测导致这个错误的原因:
<++> 编译器编译有先后之分
<++> ...
再牛逼的梦想也架不住傻逼似的坚持
分类:
MCU
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧