打印

变量被重复定义的问题,敬请指教:

[复制链接]
1743|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ahong007|  楼主 | 2009-3-8 14:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
变量被重复定义的问题,敬请指教:
在Fat32.h中定义:  
#ifndef _FAT32_H
#define _FAT32_H
struct FileInfoStruct FileInfo;        //文件信息结构体实体
struct FAT32_Init_Arg Init_Arg;           //初始化参数结构体实体
#endif



在fat32.c中
#include "fat32.h"=
使用结构体Init_Arg和 FileInfo




在sdwriteread.c函数中使用 
#include "fat32.h"
extern void FAT32_Init(struct FAT32_Init_Arg * arg );
extern struct FileInfoStruct * FAT32_OpenFile(char *filepath);  

void main()
{
    Uint32 i, temp=0;
    unsigned char BPB_temp=0x00;
    CSL_init();  
    SdRead_Sector(temp,data_buff); 
    FAT32_Init(&Init_Arg);
    FAT32_OpenFile("ABC.TXT");
    asm( "  nop ");
}
编译后出现错误的结果:
>>   error: symbol _Init_Arg is defined multiple times:
            E:projects ead_write_cpl2Debugfat32.obj and
            E:projects ead_write_cpl2Debugsdwriteread.obj
>>   error: symbol _FileInfo is defined multiple times:
            E:projects ead_write_cpl2Debugfat32.obj and
            E:projects ead_write_cpl2Debugsdwriteread.obj
头文件已经进行条件编译,还是出现重复定义的问题,不解,请给指点一下,谢谢

相关帖子

沙发
lvkush0903| | 2009-3-8 19:39 | 只看该作者

编译器的问题

由于工程中的每个.c文件都是独立编译的,即使头文件有
#ifndef _FAT32_H
#define _FAT32_H
....
#enfif
在其他C文件中只要包含了Fat32.h就会独立的解释,然后每个.c文件生成独立的相同名字的定义。在编译器链接(生成-o)时,就会将工程中所有的符号整合在一起,由于文件中有重名变量,于是就出现了重复定义的错误。

解决方法
在.c文件中声明变量,然后建一个头文件(.h文件)在所有的变量声明前加上extern,注意这里不要对变量进行的初始化。然后在其他需要使用全局变量的.c文件中包含.h文件。编译器会为.c生成目标文件,然后链接时,如果该.c文件使用了全局变量,链接器就会链接到此.c文件 。



在Fat32.h中定义变量但不初始化:  
#ifndef _FAT32_H
#define _FAT32_H
extern struct FileInfoStruct FileInfo;        //文件信息结构体实体
extern struct FAT32_Init_Arg Init_Arg;      //初始化参数结构体实体
#endif

然后在main和fat32.c中 #include "fat32.h",并初始化即可。

使用特权

评论回复
板凳
李冬发| | 2009-3-8 23:52 | 只看该作者

头文件里不能有结构实体的。

使用特权

评论回复
地板
ahong007|  楼主 | 2009-3-9 15:56 | 只看该作者

谢谢lvkush0903指点

使用特权

评论回复
5
ahong007|  楼主 | 2009-3-10 11:40 | 只看该作者

李冬发说的对,数据分配空间的不能在头文件中定义,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

120

主题

337

帖子

7

粉丝