> 描述

  <+> 环境为 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. # 2017-2018-2 20155231《网络对抗技术》实验九: Web安全基础实践

    2017-2018-2 20155231<网络对抗技术>实验九: Web安全基础实践 实验要求: 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验内容: ( ...

  2. 20155320 Exp7 网络欺诈防范

    20155320 Exp7 网络欺诈防范 [基础问题回答] (1)通常在什么场景下容易受到DNS spoof攻击 乱点链接或者连公共场合的免费WiFi也容易受到攻击,尤其是那种不需要输入密码直接就可以 ...

  3. python 回溯法 子集树模板 系列 —— 9、旅行商问题(TSP)

    问题 旅行商问题(Traveling Salesman Problem,TSP)是旅行商要到若干个城市旅行,各城市之间的费用是已知的,为了节省费用,旅行商决定从所在城市出发,到每个城市旅行一次后返回初 ...

  4. 【第十一课】Tomcat原理解析【转】

    目录 一.Tomcat顶层架构 二.Tomcat顶层架构小结: 三.Connector和Container的微妙关系 四.Connector架构分析 五.Container架构分析 六.Contain ...

  5. Java虚拟机笔记(五):JVM中对象的分代

    为什么要分代 为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用, ...

  6. Linux 僵尸进程

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...

  7. [环境配置]Ubuntu 16.04 源码编译安装OpenCV-3.2.0+OpenCV_contrib-3.2.0及产生的问题

    1.OpenCV-3.2.0+OpenCV_contrib-3.2.0编译安装过程 1)下载官方要求的依赖包 GCC 4.4.x or later CMake 2.6 or higher Git GT ...

  8. C++ new和delete 堆和栈

    一.new和delete基本用法 程序开发中内存的动态分配与管理永远是一个让C++开发者头痛的问题,在C中,一般是通过malloc和free来进行内存分配和回收的,在C++中,new和delete已经 ...

  9. 【Alpha】第二次Scrum meeting

    本次会议内容概括如下: 总结了今天各成员分配任务完成情况,对消耗时间进行统计 评估了各自对团队的贡献(影响)程度 初步讨论了日后需要逐步完成的一些任务并发布在github上 具体内容如下表所示: Me ...

  10. Python Pandas read_csv报错

    为实现文本去重(将前面采集的数据进行两两对比删除重复),写了以下代码. #-*- coding: utf-8 -*-import pandas as pd inputfile = 'e:/data/H ...