关于C语言中变量在两个.C文件中的调用问题

我使用KEIL环境假设我现在有一个tmp变量,我将在main函数中使用它现在还有一个hal.c文件,我将在hal,c中使用tmp变量。为了在两个文件中都能使用tmp变量,... 我使用KEIL环境
假设我现在有一个tmp变量,我将在main函数中使用它
现在还有一个hal.c文件,我将在hal,c中使用tmp变量。
为了在两个文件中都能使用tmp变量,所以我在hal.h中对tmp进行了声明。
然后,在main中include了hal.h,在hal.c中也include的hal.h文件。
单个编译main或者hal.c都可以通过。
但是编译整个工程就报错。
..\List\GPIO.axf: Error: L6200E: Symbol picture_state multiply defined (by hal.o and main.o).
说我两边重定义了。

同时还出现了这个warning
..\src\link.h(5): warning: #1-D: last line of file ends without a newline

我的hal.h是这样写的,看看对不对
#ifndef HAL_H
#define HAL_H
unsigned char tmp=0; //图片状态 第几张
#endif

希望能有详细的解答,如果问题解决了,我再给20分。
最后能在原理上帮我理一理,万分感激!

P.S. 这种情况,用指针会不会更好,怎么用?
展开
 我来答
南京新华电脑专修学院
2018-06-26 · 新华电脑教育用心为户提供专业
南京新华电脑专修学院
新华电脑教育用心为户提供专业的电脑相关专业疑问解答
向TA提问
展开全部
我有几个方案,我经常在VC下使用,都没问题,你试试:

方案1:在一个文件中定义全局变量“类型 tmp;”,注意是全局变量。另一个文件全局变量的位置使用“extend 类型 tmp;”。

方案2:把hal.c文件里的函数参数加一个指向tmp的指针,tmp在main中,在hal.c里的文件使用tmp时,把地址传过去就行了。
例如:
mian()
{
char tmp;
.....
.....
}
function(&tmp;...;...);
...
}
在hal.c里面
function(char *tmp;...;...)
{
....
}
这样就行了

方案1、2都不用hal.h

方案3:你把hal.c的子函数写进hal.h,在mian函数之前include一下就行了。
但不推荐此方法。

对你出现的问题的理解:
你在hal.h中声明了tmp,在两个文件里都包含它,表示包含了两次,C语言规定如果没有限定为局部变量,则各个文件都可以调用,这就导致你声明了两个名称相同的同类型变量,当然不行。
如果定义为局部变量,那么另一个文件就没办法用它了,或者这么说:两个文件各有一个tmp但不是同一个tmp,改变一个的值,另一个不变。
常用方法就是extend一下(方案1)。

顺便说一句,我从来没用过unsigned char类型,因为char类型本身就是非负的,可能是因为编译器的关系吧
雷电2006
推荐于2017-09-13 · TA获得超过1449个赞
知道小有建树答主
回答量:252
采纳率:0%
帮助的人:329万
展开全部
我有几个方案,我经常在VC下使用,都没问题,你试试:

方案1:在一个文件中定义全局变量“类型 tmp;”,注意是全局变量。另一个文件全局变量的位置使用“extend 类型 tmp;”。

方案2:把hal.c文件里的函数参数加一个指向tmp的指针,tmp在main中,在hal.c里的文件使用tmp时,把地址传过去就行了。
例如:
mian()
{
char tmp;
.....
.....
}
function(&tmp;...;...);
...
}
在hal.c里面
function(char *tmp;...;...)
{
....
}
这样就行了

方案1、2都不用hal.h

方案3:你把hal.c的子函数写进hal.h,在mian函数之前include一下就行了。
但不推荐此方法。

对你出现的问题的理解:
你在hal.h中声明了tmp,在两个文件里都包含它,表示包含了两次,C语言规定如果没有限定为局部变量,则各个文件都可以调用,这就导致你声明了两个名称相同的同类型变量,当然不行。
如果定义为局部变量,那么另一个文件就没办法用它了,或者这么说:两个文件各有一个tmp但不是同一个tmp,改变一个的值,另一个不变。
常用方法就是extend一下(方案1)。

顺便说一句,我从来没用过unsigned char类型,因为char类型本身就是非负的,可能是因为编译器的关系吧
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
11603522
2010-08-20 · 超过19用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:53.5万
展开全部
注意,定义和声明是不同的!你的做法是避免了重复声明,但是你在头文件中做了变量的定义,变量是不能重复定义的~~
如果你要在多个文件中都使用的话,在
#ifndef HAL_H
#define HAL_H
extern unsigned char tmp; //图片状态 第几张
#endif
在在某个cpp文件中进行定义
#include "**.h"
unsigned char tmp=0;
我刚调试出来,呵呵,祝你好运
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
生如红莲
2010-08-20
知道答主
回答量:14
采纳率:0%
帮助的人:13.9万
展开全部
unsigned char tmp=0; 这个是定义不是申明。所以两个c文件include了他会造成重定义。

申明应该为unsigned char temp;

为了使两个c文件访问的temp为同一个,申明需要修改为:
extern unsigned char temp;

然后再hal.c里面定义该变量:
unsigned char temp = 0;

这样就不会出错了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_baby小人_
2010-08-20 · TA获得超过253个赞
知道小有建树答主
回答量:173
采纳率:0%
帮助的人:252万
展开全部
加个static修饰符试试,即
static unsigned char tmp=0;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式