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

[复制链接]
查看11 | 回复5 | 2018-6-26 14:20:58 | 显示全部楼层 |阅读模式
我使用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-6-26 14:20:58 | 显示全部楼层
我有几个方案,我经常在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:你把ha
回复

使用道具 举报

千问 | 2018-6-26 14:20:58 | 显示全部楼层
我有几个方案,我经常在VC下使用,都没问题,你试试:方案1:在一个文件中定义全局变量“类型 tmp;”,注意是全局变量。另一个文件全局变量的位置使用“extend 类型 tmp;”。方案2:把hal.c文件里的函数参数加一个指向tmp的指针,tmp在main中,在hal.c里的文件使用tmp时,把地址传过去就行了。例如:mian()
回复

使用道具 举报

千问 | 2018-6-26 14:20:58 | 显示全部楼层
注意,定义和声明是不同的!你的做法是避免了重复声明,但是你在头文件中做了变量的定义,变量是不能重复定义的~~如果你要在多个文件中都使用的话,在#ifndef HAL_H#define HAL_Hextern unsigned char tmp; //图片状态 第几张#endif在在某个cpp文件中进行定义#include "**.
回复

使用道具 举报

千问 | 2018-6-26 14:20:58 | 显示全部楼层
unsigned char tmp=0; 这个是定义不是申明。所以两个c文件include了他会造成重定义。申明应该为unsigned char temp;为了使两个c文件访问的temp为同一个,申明需要修改为:extern unsigned char temp;然后再hal.c里面定义该变量:unsigned char te
回复

使用道具 举报

千问 | 2018-6-26 14:20:58 | 显示全部楼层
加个static修饰符试试,即static unsigned char tmp=0;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行