搜索
bottom↓
回复: 18

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

[复制链接]

出0入0汤圆

发表于 2014-2-24 23:25:50 | 显示全部楼层 |阅读模式
本人初学,在编写多文件的时候遇上一个关于全局变量重复定义的问题!!望前辈指教

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2014-2-25 09:34:52 | 显示全部楼层
其实,有没有一个好办法呢,就是所有的全局变量都放在一个dat.h文件中,然后,如果有文件需要调用

出0入0汤圆

 楼主| 发表于 2014-2-25 09:35:07 | 显示全部楼层
直接就调用dat.h文件呢

出0入0汤圆

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

出0入0汤圆

发表于 2014-2-25 10:37:33 | 显示全部楼层
据书上讲的,有2种方法。
1、全局变量在.c文件中定义,在.c的.h文件中用extern声明。这样在包含了此.h文件的.c中可以直接使用。
2、全局变量在.c文件中定义,在需要使用此全局变量的.c文件中用extern声明。

出0入0汤圆

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

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

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

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


  

出5入14汤圆

发表于 2014-2-25 12:23:07 | 显示全部楼层
我都是定义在一个 C 文件中(该文件中还包含一个 初始化变量的函数,把一些需要初始化的变量集中初始化),然后其他文件中用到时 extern 声明的!

出0入0汤圆

发表于 2014-2-25 12:25:34 | 显示全部楼层
贴出代码片段,才知道

出0入0汤圆

 楼主| 发表于 2014-2-25 14:08:59 | 显示全部楼层
richu 发表于 2014-2-25 10:25
dat.h文件中加#ifndef #define #endif语句了吗?随便参考一个别人写的头文件看看。 ...

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

出0入0汤圆

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

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

出0入0汤圆

 楼主| 发表于 2014-2-25 14:13:05 | 显示全部楼层
leicai05 发表于 2014-2-25 12:17
楼主需要搞清楚定义和声明的区别,这个对你是重点。

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

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

出0入0汤圆

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

定义好多,不好管理

出0入0汤圆

发表于 2014-2-25 15:17:25 | 显示全部楼层
对,贴出你的代码吧,这样才好说哪里需要改正

出0入0汤圆

 楼主| 发表于 2014-2-25 15:21:17 | 显示全部楼层
求解答了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-2-25 17:16:18 | 显示全部楼层
下载编译了,没出现你说的问题。由于定义的太多全局变量,编译提示RAM空间不够,在MDK配置中存储模式选为Large:XDATA。编译就通过了。

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2014-2-25 18:33:11 | 显示全部楼层
试了下 没问题
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表