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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言中变量在两个.C文件中的调用问题相关的知识,希望对你有一定的参考价值。

我使用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. 这种情况,用指针会不会更好,怎么用?

我有几个方案,我经常在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类型本身就是非负的,可能是因为编译器的关系吧
参考技术A 我有几个方案,我经常在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类型本身就是非负的,可能是因为编译器的关系吧本回答被提问者采纳
参考技术B 注意,定义和声明是不同的!你的做法是避免了重复声明,但是你在头文件中做了变量的定义,变量是不能重复定义的~~
如果你要在多个文件中都使用的话,在
#ifndef HAL_H
#define HAL_H
extern unsigned char tmp; //图片状态 第几张
#endif
在在某个cpp文件中进行定义
#include "**.h"
unsigned char tmp=0;
我刚调试出来,呵呵,祝你好运
参考技术C unsigned char tmp=0; 这个是定义不是申明。所以两个c文件include了他会造成重定义。

申明应该为unsigned char temp;

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

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

这样就不会出错了。
参考技术D 加个static修饰符试试,即
static unsigned char tmp=0;

C语言中函数调用怎么返回两个值

在主函数中调用了一个函数,我希望能有两个返回值,在调用函数中怎么去return?好像默认的是只能返回一个值吧!各位,帮帮忙(C 语言)

在C语言中,函数只能返回一个值,要返回两个值,可以改换思路,通过其它方式做到。
1 建立数组,返回指针。
在要返回的两个值类型相同时,可以用创建数组的方式,将要返回的值存在数组中,并返回数组首地址,这样就可以实现返回两个值的效果。
需要注意的是,要返回数组首地址,那么返回的值不可以是局部变量,有如下几种是可以的:
a) 使用静态局部变量存储,并返回地址;
b) 使用全局变量存储,返回地址;
c) 函数中动态分配内存,并返回申请到的地址,此种方法需要注意,在使用后需要释放;
d) 在参数中传入数组地址,并返回。即返回的实际上是主调函数中的变量地址。

2 建立结构体,返回结构体变量。
将需要返回的值,写成结构体形式,并返回结构体变量,这样可以实现一个返回值中含有多组数据。

3 当数据规模较小时,可以采用将小规模数据合并为大规模数据的方式,进行返回。
比如,需要返回两个char型数据时,可以通过返回一个short数据,高地位分别存储各自的值。

除以上方法外,还可以不使用返回值的方式,而是通过函数参数传值,或者全局变量传值等方式,将要返回的值回传给主调函数。
参考技术A return 只能同时返回一个值,要想返回多个值,可以将变量定义为static(静态的),这样在定义变量是就给它分配了内存空间,当函数生命周期结束时,变量的值任然存在,其他函数也可以使用它的值。也可以用指针变量作为函数的形参,改变指针指向的内容,也能达到改变变量值的目的。这两种方法就相当于返回多个值了。本回答被提问者采纳 参考技术B 函数是不能直接返回两个值的,不过可以通过数组,列表,链表等方式,返回多个值。例如
int
a[]
f(),这个函数返回值就是一个整型的数组,如果你要返回两个值,可以定义数组长度为2,a[0]保存第一个值,a[1]保存第二个值。
参考技术C 利用传入指针参数做返回值

例子:
矩阵行列转换,其中b[M][N]就相当于是函数返回的数组

#include "stdio.h"

#define M 3
#define N 2

void swap(int a[M][N],int b[N][M])
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
b[j][i]=a[i][j];




void main()
int i,j;
int a[M][N],b[N][M];
for(i=0;i<M;i++)
for(j=0;j<N;j++)
printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);


swap(a,b);
for(i=0;i<M;i++)
for(j=0;j<N;j++)
printf("%d ",a[i][j]);

printf("\n");

for(i=0;i<N;i++)
for(j=0;j<M;j++)
printf("%d ",b[i][j]);

printf("\n");

参考技术D 在传递给函数的变量中返回。return应该返回的是运行状态,而不是执行之后的运行结果。这是一个普遍的误解……

以上是关于关于C语言中变量在两个.C文件中的调用问题的主要内容,如果未能解决你的问题,请参考以下文章

关于c语言结构体变量成员引用的问题

关于c语言结构体变量成员引用的问题

C语言的两个问题: 所有的递归程序均可以用非递归算法实现?递归函数中的形式参数是自动变量吗? c语言中

关于C语言中auto和register的问题

关于c语言中数组作为函数参数的函数之间调用问题

在同一个C语言程序项目中,其它.c文件可以访问另一个.c文件中的静态变量吗?