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

变量被重复定义的问题的讨论相关推荐

  1. 【C语言】变量被重复定义

    如果在头文件中声明变量,然后在不同的源文件中都调用该头文件,会导致编译器报错,说变量被重复定义,(即使写了#ifndef xxxxx也不行). 解决的方法是在对应的.c文件中声明该变量,在头文件中ex ...

  2. 变量被重复定义的问题

    问:变量被重复定义的问题,敬请指教: 变量被重复定义的问题,敬请指教: 在Fat32.h中定义:   #ifndef _FAT32_H #define _FAT32_H struct FileInfo ...

  3. 如何解决“重复定义”

    头文件中一般只包含声明,不包含变量的定义,如果没办法必须在头文件中包含定义的话,多次引用该头文件时,常遇到函数或者变量被重复定义的错误,比喻file1.h中定义了int a:file2.h中也定义了 ...

  4. java 中for循环中重复定义的变量 为什么不报错?

    java 中for循环中重复定义的变量 为什么不报错? public class Test1 {public static void main(String[] args) {int[] arr = ...

  5. C语言中的强符号与弱符号(关于变量声明与定义的深入讨论)

    看到一篇介绍C语言强符号与弱符号的文章非常好,转载过来加深印象. 原文地址:http://blog.csdn.net/astrotycoon/article/details/8008629 ===== ...

  6. C++ link2005 error 错误 解决方法汇总(一般重复定义,如果都是不就是 函数定义和实现没有分离)...

    一般都是重复定义. 可以按照VS给出的信息去找相关的变量或者宏定义,还有函数. 这里需要注意include,不要重复include,不要重复定义宏. 但上述这些,都是很好理解的-- 如果大家按照上边说 ...

  7. link2005 重复定义错误

    造成LNK2005错误主要有以下几种情况:  1.重复定义全局变量. 对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下.其实这是错误的,全局变量是针对整个工程的. 正 ...

  8. extern 用法,全局变量与头文件(重复定义)

    转自 https://www.cnblogs.com/chengmin/archive/2011/09/26/2192008.html 当你要引用一个全局变量的时候,你就要声明,extern int  ...

  9. 函数或全局变量重复定义时会怎样?

    可能有些朋友第一反应是,那肯定是编译不过喽: // fun.c #include void func() {printf("编程珠玑\n"); }// main.c #includ ...

最新文章

  1. java写exe程序实例,java实现可安装的exe程序实例详解
  2. 食堂就餐刷卡系统源码_智慧食堂重新定义你的食堂管理系统
  3. 视频台词现在不用背也不用配,连对口型都免了
  4. Electron中实现拖拽文件进div中通过File对象获取文件的路径和内容
  5. 苹果雪豹操作系统正式版_苹果文件泄密?3 款新 iPhone 正式命名曝光
  6. 【机器视觉】 measure_pos算子
  7. 二十九、PHP框架Laravel学习笔记——Debugbar 调试器
  8. linux 硬盘空间还有,但是无法创建文件
  9. 美国插画家Mike Bear作品欣赏
  10. javascript 快速入门
  11. 评分卡Bad rate单调性问题
  12. office PPT插件
  13. Android 4游戏编程入门经典
  14. IC验证之测试点分解
  15. win10系统怎么调烟雾弹 win10系统怎么设置烟雾弹
  16. hadoop全家桶部署手册hadoop-solr-ranger-atlas-hive-hbase...
  17. 64匹马8个跑道问题
  18. word文件修复窍门
  19. 毕业设计记录-yolov5的wandb报错,原因和解决方法(非屏蔽wandb)
  20. 人工智能(AI)入门

热门文章

  1. 大数据智慧交通项目【完整资料】
  2. 脑电情绪识别的相关技术综述
  3. 华为云对象存储服务OBS,海量存储安全可靠,让云存储更加简单
  4. php裁剪上传图片生成缩略图
  5. 《指数基金投资指南》读书笔记---行业指数基金
  6. 安卓一键新机改串软件的原理是什么
  7. 商业级、工业级、军品级、宇航级CPU有着不同标准
  8. 如何解决ACCESS中select TOP语句返回全部记录问题?(转)
  9. 单休和双休有多大区别(月薪1万和8千如何选择)
  10. uml各类图--完整全面实例