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

来源:互联网 发布:最好的有源音箱 知乎 编辑:程序博客网 时间:2024/05/21 15:04

变量被重复定义的问题,敬请指教:
在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",并初始化即可。