> 描述
<+> 環境為 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,可編譯無錯
> 總結
<+> 以上兩種解決方法只是治標不治本,本質原因未解決
<+> 猜測導致這個錯誤的原因:
<++> 編譯器編譯有先后之分
<++> ...