> 描述

  <+> 环境为 KEIL5.20 & STM32F429工程,平台为 win10

  <+> 结构体原形如下

@File <A.h>
#include "all.h" 1 /* Define the GPS structure ---------------------------------------------------------------------*/
typedef struct
{
uint32_t alarm_flag; /* ±¨¾¯±êÖ¾ */
uint32_t status; /* ״̬ */
uint32_t latitude; /* ά¶È */
uint32_t longitude; /* ¾­¶È */
uint16_t elevation; /* º£°Î */
uint16_t speed; /* ËÙ¶È */
uint16_t direction; /* ·½Ïò */
uint8_t GMT8[]; /* GMT+8 YY-MM-DD-hh-mm-ss */
}GPS_data_s; typedef struct GPS_tpye
{
uint8_t msg_head; /* ÏûÏ¢±êʶͷ */
uint16_t msg_ID; /* ÏûÏ¢ ID */
uint16_t msg_prop; /* ÏûÏ¢ÌåÊôÐÔ */
uint8_t term_phone[]; /* ÖÕ¶ËÊÖ»úºÅ */
uint16_t msg_SwiftNum; /* ÏûÏ¢Á÷Ë®ºÅ */
GPS_data_s sMessage; /* ÏûÏ¢Ìå */
uint8_t msg_CRC; /* УÑéÂë */
uint8_t msg_tail; /* ÏûÏ¢±êʶβ */
}GPS_package_s; /* Define single union control bytes output */
typedef union
{
GPS_package_s sGPS_obj;
uint8_t GPS_byte[sizeof(GPS_package_s)];
}GPS_package_u;

  <+> 引用类型源文件如下

@File <B.c> 
#include "B.h" 1 void GMT8_to_BCD(GPS_RESULT_s *SrcObj, GPS_package_s *DesObj)
{
uint8_t i; for(i = ; i < ; i++)
{
dec_to_BCD(*(&SrcObj->GMT8.year + i), &DesObj->sMessage.GMT8[-i], );
} }
@File <B.h>
#include "all.h" 1 void GMT8_to_BCD(GPS_RESULT_s *SrcObj, GPS_package_s *DesObj);

  <+> 集合头文件 (为方便引用,all.h文件中包含了所有其他文件的头文件)

 #include "A.h"
#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,可编译无错

> 总结

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

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

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

    <++> ...

导致 KEIL error #20 的一种情况的更多相关文章

  1. LoadRunner 场景运行error的几种情况

    一. Error -27727: Step download timeout (120 seconds)has expired when downloading resource(s). Set th ...

  2. php出现“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误的一种情况,及解决方法

    PHP中的“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误,可能是因为美元符号$的误用,看下面一种情况 class Test{         s ...

  3. error: /usr/include/stdio.h: Permission denied 的一种情况分析

    error: /usr/include/stdio.h: Permission denied 的一种情况分析 代码: #include <stdio.h> int main(){ prin ...

  4. 导致“mysql has gone away”的两种情况

    导致“mysql has gone away”的两种情况 By Cruise 1.  wait_timeout参数 在开发代理server时, 我使用了jdbc连接数据库,并采用长连接的方式连接数据库 ...

  5. [小问题笔记(二)] 可能导致DropDownList的SelectedIndexChanged事件不触发的几种情况

    遇到SelectedIndexChanged事件没有触发,可以依次检查以下几种情况是否在程序中出现. 一.DropDownList的不同option设置了相同的value . 二.没有写 AutoPo ...

  6. Redo丢失的4种情况及处理方法

    这篇文章重点讨论Redo丢失的几种情况,及每种情况的处理方法. 一.说明:1.以下所说的当前日志指日志状态为CURRENT,ACTIVE,非当前日志指日志状态为INACTIVE2.不用考虑归档和非归档 ...

  7. 探讨read的返回值的三种情况

    http://blog.chinaunix.net/uid-23629988-id-3035613.html 今天探讨一个很看似简单的API “read”的返回值问题.read的返回值有哪几个值?每个 ...

  8. Git应用—05Git文件冲突合并的几种情况(转载)

    git文件冲突合并的几种情况 https://xieye.iteye.com/blog/2433229 本文描述了git冲突的几种常见情况和解决方案,老鸟请直接忽略本文.假设冲突文件是 test/Te ...

  9. hive使用spark引擎的几种情况

    使用spark引擎查询hive有以下几种方式:1>使用spark-sql(spark sql cli)2>使用spark-thrift提交查询sql3>使用hive on spark ...

随机推荐

  1. XSS跨站攻击(二)

    本人最近在学习XSS,想总结一下常见的XSS攻击的几种情况,刚好看到<防御 XSS 的七条原则>这篇文章,里面讲的七条防御原则不正是针对XSS的几种利用方式吗?于是,借来学习一下. 原则1 ...

  2. 20155237方自晨 实验四android开发基础

    提交点一 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: 安装 A ...

  3. # 2017-2018-2 20155319『网络对抗技术』Exp5:MSF基础应用

    2017-2018-2 20155319『网络对抗技术』Exp5:MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:使用者利用漏洞进行攻击 ...

  4. 一段程序的分析——C++析构器,何时析构

    最近在看小甲鱼的视频,有段程序是这么写的: #include <iostream> #include <string> class Pet { public: Pet(std: ...

  5. CF 24 D. Broken robot

    D. Broken robot 链接. 题意: 一个方格,从(x,y)出发,等价的概率向下,向左,向右,不动.如果在左右边缘上,那么等价的概率不动,向右/左,向下.走到最后一行即结束.求期望结束的步数 ...

  6. python3获取主机名、主机IP

    python3可以通过socket模块获取主机名及主机IP 代码如下: *********************************************************** 学习永远 ...

  7. [转]JVM系列三:JVM参数设置、分析

    不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java ...

  8. Flask学习-Flask app启动过程

    因为0.1版本整体代码大概只有350行,比较简单.所以本篇文章会以Flask 0.1版本源码为基础进行剖析Flask应用的启动过程. Flask参考资料flask,官网有一个最简单app: from ...

  9. Android 测试之Monkey

    一.什么是Monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序进 ...

  10. 转载别人的一篇关于git的文章

    转载网址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000