导致 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,可编译无错

 

> 总结

  <+> 以上两种解决方法只是治标不治本,本质原因未解决

  <+> 猜测导致这个错误的原因:

    <++> 编译器编译有先后之分

    <++> ...

posted @   壹点灵异  阅读(2697)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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吧
点击右上角即可分享
微信分享提示