keil 4出现ientifier"xxxxx" is undefined 问题,而又找不到出语法问题时,可能的问题。
2013-09-18 16:42
169 查看
Keil 4提示identifier “ xxxxxx” is undefined
错误的可能原因
事件发生在2013年9月18日星期三,恰值“九一八”国耻日,勿忘国耻。
果然是国耻日,今儿个特别背。
前提:程序原本是正常运行,编译通过(虽然有3个warnnings),但当我将UserAction.c中的某些代码移出该文件后,把这些代码原封不动的插入到fansystem.c文件中,这样,所有有关fan的代码都集中到fansystem.c的文件中,便于管理(尽管这样做,fansystem.c的文件已经有了2149行)。
在移动完毕所有代码后,全编译了一次,结果提示“identifier”xxxxx”is undefined”。当时并没有立即神经紧张,原因是曾经的某一天,也碰到了这个一模一样的问题。当时也很诧异,完全找不到理由为什么会提示错误,自信程序是没有语法问题的。于是一阵关闭动作之后(关闭打开的C文件,关闭打开的h文件,关闭编译器,关闭计算机),居然鬼使神差般的好了,使用也正常了。也就没理它(我靠,keil也短路的时候啊)。
然而,今天,注定不是平凡的一天,无论我如何使用“关闭”这招,使出花来,也不管用,还耗掉了一个上午的时间,天理何在啊?甚至,一度怀疑,是否我,真的哪里出错了。于是,将原来用指针的代码,全部改成了直接定义和引用,结果非但没有解决问题,反而使得error越来越多。这不科学啊,立马ctrl+z退回到“解放前”。那么究竟是哪里错了呢?
为什么另外一处一样定义的结构体,在其他文件也可以引用而无需限制引用的位置呢?这究竟是为什么呢?百思不得其解啊。崩溃啊,抓狂啊,愤怒啊。。。。。
实在没有办法了,度娘了!很失望,都是一些貌似不是问题的问题的答案。那该怎么办呢?就在此时,我打开了存放源文件的文件夹,结果发现:出问题的那个函数所在的c文件对应的h文件,居然在两个源文件里都有(怎么会这样呢,这是谁干的啊),窝火!难怪keil大婶也拿不定主意究竟哪个好,于是就选择了负担小的只有4k的h文件,而最近更新的高达17k的h文件则被丢弃了!我鄙视keil这种拈轻怕重的小人行为。于是,立即将4k的文件删除掉,又立即Build
All了一次。结果还是有问题,不过,错误的地方发生了变化。于是,发生找到了症结。继续看看还有没有重复的文件。找完后发现没有,可是问题又来了,包含原文件的文件夹有两个—正是因为如此,才给同名文件出现留下了隐患。于是将所有的源文件全部放到一个文件夹里,又build all了一遍。后来,后来还是有error,可是问题是,在编译时,出现的编译顺序,发生了变化。
为什么这样子呢?于是,打开了keil的project的mange
当选择user文件夹时,顿时明白了:
那个编译顺序,就是user文件夹里的文件顺序,而且,更大的发现是:
这就说明,这些文件的顺序,是可以调整的。如图,如果变量定义在UserAction.c里,而该变量又在user.c里使用,这并不会出现错误,而只要将h文件包含进去就OK了,这里的编译顺序,也就仅仅是编译时,先编译哪一个后编译哪一个,其实并无大碍,可问题是,若出现两个文件夹里的同名源文件(.c和.h都包括)则可能出现错误,若两个文件不一样,则必出现错误哦。
所以,综上所述,为了便于管理源文件,将所有的源文件(当然,main.c,固件库文件除外)放在一个文件夹下,这样,不会出现同名的文件,也就不会出现莫名其妙的问题了。
错误的可能原因
事件发生在2013年9月18日星期三,恰值“九一八”国耻日,勿忘国耻。
果然是国耻日,今儿个特别背。
前提:程序原本是正常运行,编译通过(虽然有3个warnnings),但当我将UserAction.c中的某些代码移出该文件后,把这些代码原封不动的插入到fansystem.c文件中,这样,所有有关fan的代码都集中到fansystem.c的文件中,便于管理(尽管这样做,fansystem.c的文件已经有了2149行)。
在移动完毕所有代码后,全编译了一次,结果提示“identifier”xxxxx”is undefined”。当时并没有立即神经紧张,原因是曾经的某一天,也碰到了这个一模一样的问题。当时也很诧异,完全找不到理由为什么会提示错误,自信程序是没有语法问题的。于是一阵关闭动作之后(关闭打开的C文件,关闭打开的h文件,关闭编译器,关闭计算机),居然鬼使神差般的好了,使用也正常了。也就没理它(我靠,keil也短路的时候啊)。
然而,今天,注定不是平凡的一天,无论我如何使用“关闭”这招,使出花来,也不管用,还耗掉了一个上午的时间,天理何在啊?甚至,一度怀疑,是否我,真的哪里出错了。于是,将原来用指针的代码,全部改成了直接定义和引用,结果非但没有解决问题,反而使得error越来越多。这不科学啊,立马ctrl+z退回到“解放前”。那么究竟是哪里错了呢?
为什么另外一处一样定义的结构体,在其他文件也可以引用而无需限制引用的位置呢?这究竟是为什么呢?百思不得其解啊。崩溃啊,抓狂啊,愤怒啊。。。。。
实在没有办法了,度娘了!很失望,都是一些貌似不是问题的问题的答案。那该怎么办呢?就在此时,我打开了存放源文件的文件夹,结果发现:出问题的那个函数所在的c文件对应的h文件,居然在两个源文件里都有(怎么会这样呢,这是谁干的啊),窝火!难怪keil大婶也拿不定主意究竟哪个好,于是就选择了负担小的只有4k的h文件,而最近更新的高达17k的h文件则被丢弃了!我鄙视keil这种拈轻怕重的小人行为。于是,立即将4k的文件删除掉,又立即Build
All了一次。结果还是有问题,不过,错误的地方发生了变化。于是,发生找到了症结。继续看看还有没有重复的文件。找完后发现没有,可是问题又来了,包含原文件的文件夹有两个—正是因为如此,才给同名文件出现留下了隐患。于是将所有的源文件全部放到一个文件夹里,又build all了一遍。后来,后来还是有error,可是问题是,在编译时,出现的编译顺序,发生了变化。
为什么这样子呢?于是,打开了keil的project的mange
当选择user文件夹时,顿时明白了:
那个编译顺序,就是user文件夹里的文件顺序,而且,更大的发现是:
这就说明,这些文件的顺序,是可以调整的。如图,如果变量定义在UserAction.c里,而该变量又在user.c里使用,这并不会出现错误,而只要将h文件包含进去就OK了,这里的编译顺序,也就仅仅是编译时,先编译哪一个后编译哪一个,其实并无大碍,可问题是,若出现两个文件夹里的同名源文件(.c和.h都包括)则可能出现错误,若两个文件不一样,则必出现错误哦。
所以,综上所述,为了便于管理源文件,将所有的源文件(当然,main.c,固件库文件除外)放在一个文件夹下,这样,不会出现同名的文件,也就不会出现莫名其妙的问题了。
相关文章推荐
- oracle10g "数据源管理器"找不到应用程序,可能是程序没有正确安装"问题解决
- 用gcc编译.cpp文件可能出现"undefined reference to `__gxx_personality_v0'"问题的解决
- 安装matlab到99%时出现的问题:在您的许可证文件中找不到 SERVER 行。您需要在 "......" 中手动编辑 SERVER
- 用gcc编译.cpp文件可能出现"undefined reference to `__gxx_personality_v0'"问题的解决
- 解决ADT大量出现"Unexpected value from nativeGetEnabledTags: 0"的问题
- 解决Visual Studio编译出现Moc'ing文件,系统找不到指定路径问题
- 如何解决Mysql "发生系统错误2,找不到指定的文件" 的问题(第一次安装使用)
- 关于安装.NET Framework 2.0时偶然碰到的问题(提示"Error 205015. 安装程序集..../System.EnterpriseServices.dll失败,原因是出现了系统错误:拒绝访问。")
- DALFactory出现"未能加载文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件”的解决方案 .
- 关于Qt开发MySQL程序移植后出现"Driver not loaded"的问题
- fopen()函数以"a+"方式打开一个不存在的文件后读写出现问题
- 收藏:Asp.Net 连接Oracle数据库 出现"找不到 Oracle 客户端和网络组件" 彻底解决方法!
- IOS引用三方framewrok的头文件出现'xxxxx/xxxx.h' file not found问题解决方法
- Xcode pch中加入#include <opencv2/opencv.hpp>出现#include <list>找不到symbol 的问题
- 使用dsoframer控件出现"Unable to display the inactive document. Click here to reactivate the document."的问题
- 如何解决"找不到MSVCR80.dll "的问题
- 解决Xcode引入第三方SDK找不到头文件和_OBJC_CLASS_$_某文件名", referenced from:xx 问题
- 解决了Office2007"向程序发送命令时出现错误 "的问题
- 如何处理Oledb中EXCEL驱动读取EXCEL文件中字段长度大于255字符时出现的"数据截断"问题.
- no installed service named "Apache2" 安装Apache问题:系统找不到指定的文件 No installed service named "Apache2"