变量被重复定义的问题的讨论
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",并初始化即可。
在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",并初始化即可。
相关文章推荐
- 保护宏不可以解决变量重复定义的问题
- C++ 头文件中为何添加了#ifndef #define #endif还会出现变量重复定义的问题
- 变量被重复定义的问题
- C/C++语言中全局变量重复定义问题的解决方法
- 问题:oracle DECLARE 变量重复利用;结果:Oracle 定义变量总结
- C++头文件中为何添加了#ifndef #define #endif还会出现变量重复定义的问题
- keil中建立多个c文件时,出现*** ERROR LXX: MULTIPLE PUBLIC DEFINITIONS问题(变量重复定义)。
- 解决C/C++语言中全局变量重复定义的问题
- C++多个头文件重复定义变量问题
- 解决C/C++语言中全局变量重复定义的问题
- 关于头文件变量重复定义问题怎么解决(thinkvd开发日志)
- stringstream定义的变量在重复使用时的问题
- 解决重复包含一个头文件时变量重复定义的问题
- c++ 变量的重复定义问题 [multiple definition of] 与模板类
- C语言中全局变量的定义及重复包含问题
- java 和 c等作用域问题,循环中重复定义变量
- pl/sql 关于变量定义的问题
- KEILC51编译问题ERROR L104: MULTIPLE PUBLIC DEFINITIONS重复定义
- c++中switch case 中关于变量定义问题
- [承前]Saxon执行XQuery时的"重复变量(duplicate global variable)"声明问题