原创 C51总结之二(关于重定义及外部函数的烦恼)

2009-8-3 16:21 3366 4 6 分类: MCU/ 嵌入式

  //----------------------------------------------------------------------------------


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


郁闷这个鸟错误又出来了,不过随后给解决了。


狗日的重定义。


 


俺总结了一下:


 


全局定义结构体


//-----变量定义----


extern struct fm3130time//时间结构变量3130使用


{


              uchar RTCyear;


              uchar RTCmonth;


              uchar RTCdate;


              uchar RTCday;


              uchar RTChour;


              uchar RTCminute;


              uchar RTCsecend;


}xdata FM3130RTCtime;


 


注意这样是会出错的,即便是在本C文件中使用,它还是会出现以下警告:


*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL


    SYMBOL:  FM3130RTCTIME


    MODULE:  fm3130_Init.obj (FM3130_INIT)


ADDRESS: 69D7H


所以,你还是需要解决它。


俺的方法:在全局定义之后,再在本C文件中再定义一次,也就是说上述的全局结构体变量在头文件定义以后,俺以本C文件中又定义了一次,如下:


struct fm3130time xdata FM3130RTCtime;


注意:如果有好几个C文件同时使用,只需要其中一个C文件定义即可。其它C文件不需要再定义,否则就会又出现重定义。


  


重定义的问题


 


第一种:不涉及到全局变量,纯粹是变量冲突,这种情况是你几个头文件中定义给本C文件的变量有重名。


例如:


”math.h”(算法头文件)


“type_init.h”(类型定义头文件)


两个头文件中,同时定义:uchar RTCtime;


立马出现下面的错误:


*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
       SYMBOL: RTCtime
       MODULE: 222.obj (222)


 


解决之道:把重名的变量,更名就可以。


 


第二种:涉及到全局变量。一般全局变量使用”extern”。其麻烦在于需要双重定义。特别是全局数组变量(尤其注意)


一般这么处理:


在头文件中使用extern 定义全局变量,切记不要初始化。


然后再在需要调用此变量的C文件中再定义一次,注:这次定义不需要extern,同时给此变量初始化。


总而言之:记住两点,全局变量头文件中只定义,并且使用变量的C文件中再定义并且初始化。


注意:如果有好几个C文件同时使用,只需要其中一个C文件定义使初始化即可。其它C文件不需要再定义,否则就会又出现重定义。


 


举例说明:


extern uchar mm[16];-----------------头文件中只定义


 


 


在使用此数组变量的C文件中,再进行定义并且初始化如下:


Uchar mm[16]=


{


      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0


}


如果使用此数组变量的C文件中不定义或者在头文件中就把此数组变量给初始化掉,那么就会出现下面错误:


   *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
       SYMBOL: mm
       MODULE: 222.obj (222)


 


 


//--------------------------------------------------------------------------

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

tengjingshu_112148725 2009-8-4 00:17

先收藏再看

用户208176 2009-8-3 19:56

感谢,受教了。
相关推荐阅读
用户216937 2010-10-29 10:26
CODE RW RO ZI
学习使用keil,总结一点学习经验。解释几个名词:编译的一个ARM的程序,编译结果中的一句话Program Size: Code=8044 RO-data=52 RW-data=56 ZI-data=...
用户216937 2009-09-18 15:37
MDK报警:Warning : L6305W
ADS 编译警告:Warning : L6305W : Image does not have an entry point2007-08-23 10:37        ADS 编译时出现警告:“W...
用户216937 2009-09-10 17:44
关于KEIL的若干BUG修复
//-------------------------------------------------------------  一: 光标问题        Keil uv3 中会出现光标定位不准的...
用户216937 2009-09-10 17:29
ARM之RO、RW、ZI解释
//-------------------------------------------------------------------    一般而言,一个程序包括只读的代码段和可读写的数据段。 ...
用户216937 2009-08-19 23:15
Keil for ARM的编译错误之一
症状,在KEIL中建立了工程之后,编译就出现这样的提示can't execute 'C:\Keil\C51\BIN\A51.EXE'在百度上找到了以下的解答出错原因;被打开的KEIL程序的编译器安装在...
用户216937 2009-08-09 11:57
c51总结之三:关于KEIL51编译汉字
https://static.assets-stash.eet-china.com/album/old-resources/2009/8/9/ff312653-399c-463d-8979-dc8ec...
EE直播间
更多
我要评论
2
4
关闭 站长推荐上一条 /3 下一条