//----------------------------------------------------------------------------------
<?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)
//--------------------------------------------------------------------------
tengjingshu_112148725 2009-8-4 00:17
用户208176 2009-8-3 19:56