zoukankan      html  css  js  c++  java
  • 导致 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,可编译无错

    > 总结

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

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

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

        <++> ...

  • 相关阅读:
    New Year and Domino 二维前缀和
    java课堂作业(三)
    java课堂作业(二)
    java课堂作业(一)
    java听课笔记(四)
    java听课笔记(三)
    java听课笔记(二)
    java听课笔记(一)
    java零碎
    java继承中的构造方法
  • 原文地址:https://www.cnblogs.com/skullboyer/p/8430129.html
Copyright © 2011-2022 走看看