keil 4出现ientifier"xxxxx" is undefined 问题,而又找不到出语法问题时,可能的问题。

Keil 4提示identifier “ xxxxxx” is undefined 错误的可能原因

事件发生在2013918日星期三,恰值“九一八”国耻日,勿忘国耻。

 

果然是国耻日,今儿个特别背。

 

前提:程序原本是正常运行,编译通过(虽然有3warnnings,但当我将UserAction.c中的某些代码移出该文件后,把这些代码原封不动的插入到fansystem.c文件中,这样,所有有关fan的代码都集中到fansystem.c的文件中,便于管理(尽管这样做,fansystem.c的文件已经有了2149)

 

         在移动完毕所有代码后,全编译了一次,结果提示“identifier”xxxxx”is undefined”。当时并没有立即神经紧张,原因是曾经的某一天,也碰到了这个一模一样的问题。当时也很诧异,完全找不到理由为什么会提示错误,自信程序是没有语法问题的。于是一阵关闭动作之后(关闭打开的C文件,关闭打开的h文件,关闭编译器,关闭计算机),居然鬼使神差般的好了,使用也正常了。也就没理它(我靠,keil也短路的时候啊)。

         然而,今天,注定不是平凡的一天,无论我如何使用“关闭”这招,使出花来,也不管用,还耗掉了一个上午的时间,天理何在啊?甚至,一度怀疑,是否我,真的哪里出错了。于是,将原来用指针的代码,全部改成了直接定义和引用,结果非但没有解决问题,反而使得error越来越多。这不科学啊,立马ctrl+z退回到“解放前”。那么究竟是哪里错了呢?

为什么另外一处一样定义的结构体,在其他文件也可以引用而无需限制引用的位置呢?这究竟是为什么呢?百思不得其解啊。崩溃啊,抓狂啊,愤怒啊。。。。。

         实在没有办法了,度娘了!很失望,都是一些貌似不是问题的问题的答案。那该怎么办呢?就在此时,我打开了存放源文件的文件夹,结果发现:出问题的那个函数所在的c文件对应的h文件,居然在两个源文件里都有(怎么会这样呢,这是谁干的啊),窝火!难怪keil大婶也拿不定主意究竟哪个好,于是就选择了负担小的只有4kh文件,而最近更新的高达17kh文件则被丢弃了!我鄙视keil这种拈轻怕重的小人行为。于是,立即将4k的文件删除掉,又立即Build All了一次。结果还是有问题,不过,错误的地方发生了变化。于是,发生找到了症结。继续看看还有没有重复的文件。找完后发现没有,可是问题又来了,包含原文件的文件夹有两个正是因为如此,才给同名文件出现留下了隐患。于是将所有的源文件全部放到一个文件夹里,又build all了一遍。后来,后来还是有error,可是问题是,在编译时,出现的编译顺序,发生了变化。

        

 

为什么这样子呢?于是,打开了keilprojectmange

当选择user文件夹时,顿时明白了:

那个编译顺序,就是user文件夹里的文件顺序,而且,更大的发现是:

这就说明,这些文件的顺序,是可以调整的。如图,如果变量定义在UserAction.c里,而该变量又在user.c里使用,这并不会出现错误,而只要将h文件包含进去就OK了,这里的编译顺序,也就仅仅是编译时,先编译哪一个后编译哪一个,其实并无大碍,可问题是,若出现两个文件夹里的同名源文件(.c.h都包括)则可能出现错误,若两个文件不一样,则必出现错误哦。

 

所以,综上所述,为了便于管理源文件,将所有的源文件(当然,main.c,固件库文件除外)放在一个文件夹下,这样,不会出现同名的文件,也就不会出现莫名其妙的问题了。

你可能感兴趣的:(单片机)