一种KEIL中定义过的变量在使用中提示未定义的情况
【环境】
> KEIL5.25
> win10
> @2018-4-23
【问题】
头文件互包含导致的错误(使用了另一文件的类型定义)
文件<fileA.h>
<fileA.h> #ifndef __FILEA_H__
#define __FILEA_H__ #include "fileB.h" typedef struct
{
int var;
}stuct_A_s; #endif
文件<fileB.h>
<fileB.h> #ifndef __FILEB_H__
#define __FILEB_H__ #include "fileA.h" typedef struct
{
int var;
struct_A_s obj;
}struct_B_s; #endif
编译后报错:在文件<fileB.h>中 error: #20: identifier "struct_A_s" is undefined
【分析】
导致上述错误的原因,是在文件<fileA.h>中,使用了 fileB.h,而文件<fileB.h>中使用的类 struct_A_s 在其定义之前,故产生了先使用后定义的语法错误
具体分析:
从文件<fileA.h>开始分析:
> 执行避免头文件重复包含的宏 --- <fileA.h>
> 包含文件<fileB.h>,进入文件<fileB.h>
> 执行避免头文件重复包含的宏 --- <fileB.h>
> 包含文件<fileA.h>,进入文件<fileA.h>
> 由于避免重复包含宏的控制,进不去A文件内容部分,跳转回文件<fileB.h>
> 执行结构体 struct_B_s 定义,结构体成员类型使用了结构体 struct_A_s ,这就出现了使用了未定义的情况,执行完毕跳转回文件<fileA.h>
> 执行结构体 struct_A_s 定义,结合上一步就发生了先使用后定义的问题,执行完毕结束
结论:编译器先从文件<fileA.h>开始编译就会出现本文所示错误
从文件<fileB.h>开始分析:
> 执行避免头文件重复包含的宏 --- <fileB.h>
> 包含文件<fileA.h>,进入文件<fileA.h>
> 执行避免头文件重复包含的宏 --- <fileA.h>
> 包含文件<fileB.h>,进入文件<fileB.h>
> 由于避免重复包含宏的控制,进不去B文件内容部分,跳转回文件<fileA.h>
> 执行结构体 struct_A_s 定义,执行完毕跳转回文件<fileB.h>
> 执行结构体 struct_B_s 定义,执行完毕结束
结论:编译器先从文件<fileB.h>开始编译就不会报错误
【解决】
# 去除文件<fileA.h>中包含文件<fileB.h>的语句部分,可解决此问题
# 由于分析推出是编译顺序导致错误的出现,特做了一下一些事做实验:
> 控制文件 <fileA.h> 与 <fileB.h> 的编译顺序 (做了文件名的更改,即按照字母表顺序修改文件名达到两次编译时两个文件的排序相异)
> 两次编译的结果都是报相同的错误,error: #20: identifier "struct_A_s" is undefined
【结论】
# 综上暂推出,编译器在编译时,每个文件都会单独编译一遍,所以不论文件 <fileA.h> 与 <fileB.h> 的排序,都会出现相同的问题
# 一般是杜绝文件互相包含的,因为文件包含的意义就是要使用被包含文件的一些定义,互相包含就会出现先使用后定义 的情况发生
# 了解一些编译原理的知识后,将会得到更权威的解惑,以上只是根据现象分析的结果
一种KEIL中定义过的变量在使用中提示未定义的情况的更多相关文章
- 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程
继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...
- 【Spring Framework】12种spring中定义bean的方法
前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...
- js中定义属性和变量
//定义数组 var arr = []; //定义对象 var obj = {}; //定义正则表达式 var reg = /../;
- 007、Java中定义int型变量
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- 解决webkit浏览器中js方法中使用window.event提示未定义的问题
这实际上是一个浏览器兼容性问题,根源百度中一大堆,简要说就是ie中event对象是全局变量,所以哪里都能使用到,但是webkit内核的浏览器中却不存在这个全局变量event,而是以一个隐式的局部变量的 ...
- VC中明明已经添加了头文件却还提示未定义的问题
我在VS中编译程序遇到这个错误:error C3861: 'ReadDirectoryChangesW': identifier not found, even with argument-depen ...
- strcasecmp在VS2010中提示未定义标识符
分析: strcasecmp(*,*)是用来比较字符串,定义在string.h头文件中,但是在windows下即使添加string.h头文件,依然会报错. 解决: 添加 #if defined(_MS ...
- (转载)JavaScript中定义变量
(转载)http://blog.163.com/xuxiaoqianhz@126/blog/static/165190577201061594421870/ JavaScript中定义变量有两种方式: ...
- MFC 如何在一个类中使用在其他类中定义的变量或函数
[声明:本文的知识点来源于网络,参考网址:https://blog.csdn.net/bill_ming/article/details/7407848] [以下三种方法亲测有效,可以根据具体情况来选 ...
随机推荐
- TPO-23 C2 Advice on choosing courses
第 1 段 1.Listen to a conversation between a student and his English professor. 请听一段学生与他的英文教授的对话. 第 2 ...
- 人工智能AI芯片与Maker创意接轨 (上)
近几年来人工智能(Artificial Intelligence, AI)喴的震天价响,吃也要AI,穿也要AI,连上个厕所也要来个AI智能健康分析,生活周遭食衣住行育乐几乎无处不AI,彷佛已经来到科幻 ...
- [Processing]点到线段的最小距离
PVector p1,p2,n; float d = 0; void setup() { size(600,600); p1 = new PVector(150,30);//线段第一个端点 p2 = ...
- 前端开发利器 livereload -- 从此告别浏览器F5键
各位从事前端开发的童鞋们,大家每天coding && coding,然后F5 && F5,今天推荐一个静态文件在浏览器中自动更新的扩展 livereload,不同手动刷 ...
- Ubuntu下LimeSDR Mini使用说明
本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 LimeSDR链接:https://item.taobao.com/item.htm?spm=a230r.1 ...
- ltrace命令详解
原文链接:https://ipcmen.com/ltrace 用来跟踪进程调用库函数的情况 补充说明 NAME ltrace - A library call tracer ltrace命 ...
- D.王者荣耀交流协会——PSP Daily(测评人:贾男男)
D.王者荣耀交流协会——PSP Daily(测评人:贾男男) 一.基于NABCD评论作品,及改进建议 每个小组评论其他小组beta发布的作品.1.根据(不限于)NABCD评论作品的选题;2.评论作品对 ...
- 软件工程-东北师大站-第十一次作业(PSP)
PSP 饼状图 2.本周进度条 3.本周累计进度图 代码累计折线图 博文字数累计折线图
- java的内存管理机制
1.内存区域的分类 栈内存:基本类型变量和对象的引用,优势在于存取速度快 堆内存:new创建的对象和数组以及对象的实例化变量,优势在于动态分配内存,但是存取速度相对较慢 2.不同类型的内存分配 (1) ...
- Scrum Meeting 10.26
1.会议内容 姓名 今日任务 明日任务 预估时间(h) 徐越 学习服务器配置 配置SQLserver 4 卞忠昊 阅读代码 找上届代码的bug 3 武鑫 查阅资料 查阅资料,各种app的界面设计 3 ...