您的位置:首页 > 其它

变量被重复定义的问题的讨论

2010-01-08 11:57 253 查看
变量被重复定义的问题,敬请指教:
在Fat32.h中定义:
#ifndef _FAT32_H
#define _FAT32_H
struct FileInfoStruct FileInfo; //文件信息结构体实体
struct FAT32_Init_Arg Init_Arg; //初始化参数结构体实体
#endif

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

在sdwriteread.c函数中使用
#i nclude "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//read_write_cpl2//Debug//fat32.obj and
E://projects//read_write_cpl2//Debug//sdwriteread.obj
>> error: symbol _FileInfo is defined multiple times:
E://projects//read_write_cpl2//Debug//fat32.obj and
E://projects//read_write_cpl2//Debug//sdwriteread.obj
头文件已经进行条件编译,还是出现重复定义的问题,不解,请给指点一下,谢谢

由于工程中的每个.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
在fat32.c中

struct FileInfoStruct FileInfo; //文件信息结构体实体
struct FAT32_Init_Arg Init_Arg; //初始化参数结构体实体

然后在main和fat32.c中 #i nclude "fat32.h",并初始化即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: