变量被重复定义的问题的讨论
变量被重复定义的问题,敬请指教:
在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 xxxxx也不行). 解决的方法是在对应的.c文件中声明该变量,在头文件中ex ...
- 变量被重复定义的问题
问:变量被重复定义的问题,敬请指教: 变量被重复定义的问题,敬请指教: 在Fat32.h中定义: #ifndef _FAT32_H #define _FAT32_H struct FileInfo ...
- 如何解决“重复定义”
头文件中一般只包含声明,不包含变量的定义,如果没办法必须在头文件中包含定义的话,多次引用该头文件时,常遇到函数或者变量被重复定义的错误,比喻file1.h中定义了int a:file2.h中也定义了 ...
- java 中for循环中重复定义的变量 为什么不报错?
java 中for循环中重复定义的变量 为什么不报错? public class Test1 {public static void main(String[] args) {int[] arr = ...
- C语言中的强符号与弱符号(关于变量声明与定义的深入讨论)
看到一篇介绍C语言强符号与弱符号的文章非常好,转载过来加深印象. 原文地址:http://blog.csdn.net/astrotycoon/article/details/8008629 ===== ...
- C++ link2005 error 错误 解决方法汇总(一般重复定义,如果都是不就是 函数定义和实现没有分离)...
一般都是重复定义. 可以按照VS给出的信息去找相关的变量或者宏定义,还有函数. 这里需要注意include,不要重复include,不要重复定义宏. 但上述这些,都是很好理解的-- 如果大家按照上边说 ...
- link2005 重复定义错误
造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量. 对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下.其实这是错误的,全局变量是针对整个工程的. 正 ...
- extern 用法,全局变量与头文件(重复定义)
转自 https://www.cnblogs.com/chengmin/archive/2011/09/26/2192008.html 当你要引用一个全局变量的时候,你就要声明,extern int ...
- 函数或全局变量重复定义时会怎样?
可能有些朋友第一反应是,那肯定是编译不过喽: // fun.c #include void func() {printf("编程珠玑\n"); }// main.c #includ ...
最新文章
- java写exe程序实例,java实现可安装的exe程序实例详解
- 食堂就餐刷卡系统源码_智慧食堂重新定义你的食堂管理系统
- 视频台词现在不用背也不用配,连对口型都免了
- Electron中实现拖拽文件进div中通过File对象获取文件的路径和内容
- 苹果雪豹操作系统正式版_苹果文件泄密?3 款新 iPhone 正式命名曝光
- 【机器视觉】 measure_pos算子
- 二十九、PHP框架Laravel学习笔记——Debugbar 调试器
- linux 硬盘空间还有,但是无法创建文件
- 美国插画家Mike Bear作品欣赏
- javascript 快速入门
- 评分卡Bad rate单调性问题
- office PPT插件
- Android 4游戏编程入门经典
- IC验证之测试点分解
- win10系统怎么调烟雾弹 win10系统怎么设置烟雾弹
- hadoop全家桶部署手册hadoop-solr-ranger-atlas-hive-hbase...
- 64匹马8个跑道问题
- word文件修复窍门
- 毕业设计记录-yolov5的wandb报错,原因和解决方法(非屏蔽wandb)
- 人工智能(AI)入门