導致 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,可編譯無錯

 

> 總結

  <+> 以上兩種解決方法只是治標不治本,本質原因未解決

  <+> 猜測導致這個錯誤的原因:

    <++> 編譯器編譯有先后之分

    <++> ...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM