qq开始学单片机 发表于 2014-2-24 23:25:50

大家,请教一个在编程上的问题!!!!!!!!求解答

本人初学,在编写多文件的时候遇上一个关于全局变量重复定义的问题!!望前辈指教

我把所有文件需要用到的全局变量都定义在dat.h文件中,然后在main.h文件中包含,然后执行主函数,但是这样出一个错误就是定义重复!!
应该怎么解决,才能把所有的全局变量放在一个dat.h文件中而不影响编译呢?

qq开始学单片机 发表于 2014-2-25 09:34:52

其实,有没有一个好办法呢,就是所有的全局变量都放在一个dat.h文件中,然后,如果有文件需要调用

qq开始学单片机 发表于 2014-2-25 09:35:07

直接就调用dat.h文件呢

richu 发表于 2014-2-25 10:25:01

dat.h文件中加#ifndef #define #endif语句了吗?随便参考一个别人写的头文件看看。

sbusr 发表于 2014-2-25 10:37:33

据书上讲的,有2种方法。
1、全局变量在.c文件中定义,在.c的.h文件中用extern声明。这样在包含了此.h文件的.c中可以直接使用。
2、全局变量在.c文件中定义,在需要使用此全局变量的.c文件中用extern声明。

leicai05 发表于 2014-2-25 12:17:05

楼主需要搞清楚定义和声明的区别,这个对你是重点。

1. 如果你在a.c文件中定义一个变量,例如 char ss = 0;
   而在b.c文件中需要用到ss变量,你需要在b.c中声明这个全局变量,方法是externchar ss;

2.如果你想把所有全局变量定义到一个c文件中,方便管理。那你需要使用到一定的
条件编译的技巧,每个人使用的也不同,我是这么做的:
在gobal_data.c中定义所有的全局变量 ,例如定义ss
/**********************
#ifdef   QJ_BZ
#defineQJ_EXT
#else
#defineQJ_EXT extern
#endif
QJ_EXT char ss;
***************************/

在a.c中需要定义ss文件的时候只需要在#include"gobal_data.c"前增加宏定义#define QJ_BZ即可,
在b.c中需要使用ss时,只需要在前面#include"gobal_data.c" 就表示声明了这个全局变量了。



EMC菜鸟 发表于 2014-2-25 12:23:07

我都是定义在一个 C 文件中(该文件中还包含一个 初始化变量的函数,把一些需要初始化的变量集中初始化),然后其他文件中用到时 extern 声明的!

yuntian 发表于 2014-2-25 12:25:34

贴出代码片段,才知道

qq开始学单片机 发表于 2014-2-25 14:08:59

richu 发表于 2014-2-25 10:25
dat.h文件中加#ifndef #define #endif语句了吗?随便参考一个别人写的头文件看看。 ...

我每一个h文件都会写条件编译的

qq开始学单片机 发表于 2014-2-25 14:10:13

sbusr 发表于 2014-2-25 10:37
据书上讲的,有2种方法。
1、全局变量在.c文件中定义,在.c的.h文件中用extern声明。这样在包含了此.h文件 ...

我定义的全局变量有很多,如果再c定义和在h声明,代码段会很多

qq开始学单片机 发表于 2014-2-25 14:13:05

leicai05 发表于 2014-2-25 12:17
楼主需要搞清楚定义和声明的区别,这个对你是重点。

1. 如果你在a.c文件中定义一个变量,例如 char ss = 0 ...

include“.c文件”?一般都是包含.h文件,我还没包含过.c文件

qq开始学单片机 发表于 2014-2-25 14:13:30

EMC菜鸟 发表于 2014-2-25 12:23
我都是定义在一个 C 文件中(该文件中还包含一个 初始化变量的函数,把一些需要初始化的变量集中初始化), ...

定义好多,不好管理

leicai05 发表于 2014-2-25 15:17:25

对,贴出你的代码吧,这样才好说哪里需要改正

qq开始学单片机 发表于 2014-2-25 15:21:17

求解答了

richu 发表于 2014-2-25 17:16:18

下载编译了,没出现你说的问题。由于定义的太多全局变量,编译提示RAM空间不够,在MDK配置中存储模式选为Large:XDATA。编译就通过了。

qq开始学单片机 发表于 2014-2-25 18:11:01

richu 发表于 2014-2-25 17:16
下载编译了,没出现你说的问题。由于定义的太多全局变量,编译提示RAM空间不够,在MDK配置中存储模式选为La ...

为什么我参考的那个代码跟我这个代码一模一样,不需要改变MDK就可以编译通过

richu 发表于 2014-2-25 18:24:29

qq开始学单片机 发表于 2014-2-25 18:11
为什么我参考的那个代码跟我这个代码一模一样,不需要改变MDK就可以编译通过 ...

可能与好多因素有关,比如所选择芯片的型号等等。具体还要看代码和MDK的配置。

qq开始学单片机 发表于 2014-2-25 18:27:39

richu 发表于 2014-2-25 18:24
可能与好多因素有关,比如所选择芯片的型号等等。具体还要看代码和MDK的配置。 ...

我跟他的选型,芯片型号,他的代码在我的编译器通过

wdh2152 发表于 2014-2-25 18:33:11

试了下 没问题
页: [1]
查看完整版本: 大家,请教一个在编程上的问题!!!!!!!!求解答