导致 KEIL error #20 的一种情况
> 描述
<+> 环境为 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 的一种情况的更多相关文章
- LoadRunner 场景运行error的几种情况
一. Error -27727: Step download timeout (120 seconds)has expired when downloading resource(s). Set th ...
- php出现“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误的一种情况,及解决方法
PHP中的“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误,可能是因为美元符号$的误用,看下面一种情况 class Test{ s ...
- error: /usr/include/stdio.h: Permission denied 的一种情况分析
error: /usr/include/stdio.h: Permission denied 的一种情况分析 代码: #include <stdio.h> int main(){ prin ...
- 导致“mysql has gone away”的两种情况
导致“mysql has gone away”的两种情况 By Cruise 1. wait_timeout参数 在开发代理server时, 我使用了jdbc连接数据库,并采用长连接的方式连接数据库 ...
- [小问题笔记(二)] 可能导致DropDownList的SelectedIndexChanged事件不触发的几种情况
遇到SelectedIndexChanged事件没有触发,可以依次检查以下几种情况是否在程序中出现. 一.DropDownList的不同option设置了相同的value . 二.没有写 AutoPo ...
- Redo丢失的4种情况及处理方法
这篇文章重点讨论Redo丢失的几种情况,及每种情况的处理方法. 一.说明:1.以下所说的当前日志指日志状态为CURRENT,ACTIVE,非当前日志指日志状态为INACTIVE2.不用考虑归档和非归档 ...
- 探讨read的返回值的三种情况
http://blog.chinaunix.net/uid-23629988-id-3035613.html 今天探讨一个很看似简单的API “read”的返回值问题.read的返回值有哪几个值?每个 ...
- Git应用—05Git文件冲突合并的几种情况(转载)
git文件冲突合并的几种情况 https://xieye.iteye.com/blog/2433229 本文描述了git冲突的几种常见情况和解决方案,老鸟请直接忽略本文.假设冲突文件是 test/Te ...
- hive使用spark引擎的几种情况
使用spark引擎查询hive有以下几种方式:1>使用spark-sql(spark sql cli)2>使用spark-thrift提交查询sql3>使用hive on spark ...
随机推荐
- 【H5】滚动事件(jq)
$(function(){ console.log($('html,body').scrollTop()); //记录滚动高度(滚动前) }) $('html,body').scroll(funct ...
- spring-boot dubbo项目使用docker方式部署
项目结构 本项目采用maven构建,有三个模块,分别是pms-interfaces, pms-services, pms-portal. 模块 描述 pms-interfaces 接口层,只能存放实体 ...
- [清华集训2015 Day2]矩阵变换-[稳定婚姻模型]
Description 给出一个N行M列的矩阵,保证满足以下性质: M>N. 矩阵中每个数都是 [0,N]中的自然数. 每行中, [1,N]中每个自然数刚好出现一次,其余的都是0. 每列中,[1 ...
- C++中的this和Python的self对比
Python,当实例对象调用函数(函数其实都是属于类空间的)的时候,系统会自动将对象本身传入 函数在定义时的第一个变量一般是self.(但self并不是关键字,用其他名字也可以) 定义 ...
- 【第三课】Centos 7.x系统安装和网络配置以及远程密钥登录
目录 一.安装CentOS 7.3 二.配置网络 1.使用dhclient命令自动获取ip地址 2.使用ip addr或ifconfig命令查看网卡信息 3.使用route命令查看路由信息 4.通过修 ...
- Docker-compose部署gitlab中文版
目录 Docker-compose部署gitlab 1.安装Docker 2.安装Docker-compose 3.安装Gitlab Docker-compose部署gitlab 1.安装Docker ...
- 百度地图API的网页使用
请看图示(以及参考官方文档): 图片尺寸:1710x822
- Bitcoin挖矿
目录 为什么要挖矿? 比特币挖矿 为什么要挖矿? 增加恶意行为的成本 增加记账权力,获取相应的奖励 比特币挖矿 每开采210000个区块,挖矿奖励减半 2009年1月-2012年11月,奖励50BTC ...
- Beta阶段展示博客
Beta阶段展示博客 1. 团队成员的简介和个人博客地址 刘畅 博客园ID:森高Slontia 身份:PM 个人介绍: 弹丸粉 || 小说创作爱好者 || 撸猫狂魔(x || 生命的价值在于创造 (我 ...
- Android中应用contentprovider来创建数据库的一些步骤
http://blog.csdn.net/xiaodongvtion/article/details/7865669 1:首先创建一个xxprovider的class,它是extendscontent ...