完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 博学而笃志 于 2015-12-28 09:42 编辑
keil采用C语言模块化编程时全局变量问题 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!http://www.xuebuyuan.com/909661.html 以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧! 后来学会了在keil里进行模块化编程,即只把功能相同或相近的函数写在同一个c文件,这样以来一个项目往往由很多个c文件组成,但又带来一个问题即是某些c文件之间需要相互通信,一般我们都采用了全局变量,对吧。很多同学虽然知道在其它c文件里引用全局变量要用extern进行声明,但对此操作时往往思路不清,迷迷糊糊,经常遇到一堆错误提示,然后一个一个排除,既费时又费力,可怕的是下次还会遇到同样的问题。本人曾经也遇到过类似问题,故在此将模块化编程里的全局变量、结构体、头文件相关问题详述一遍,大家照着做,就能确保无误! 一、关于全局变量的定义、声明、引用: 方法1: 在某个c文件里定义全局变量后,在其它c文件要用,则在要用c文件里用extern进行声明。说来轻巧但还是很多同学会出问题。请看下面注意事项方可解决! 注: (1)在定义全局变量时可同时将其初始化 (2)在用extern声明时不能再初始化,否则编译器报错 举例:有两个c文件分别为one.c和two.c,two中要用到one中的全局变量N,怎么办? 答案:在one.c中定义且初始化:u8 N = 0; 再在two.c中声明:extern u8 N;(注:此处不能加= 0) 方法2: 同样对于方法1中的例子,我推荐采用方法2。 答案:在one.c中定义且初始化:u8 N = 0; 再在one.h中用extern声明:extern u8 N;(注:此处不能加= 0) 最后在two.c中包含one.h:#include "one.h" 由于方法2的可移植性较方法一要强,故采用2较好! 对方法2的总结为:全局变量的定义和初始化放在c文件中,声明放在对应的h文件中。 且要注意h文件里应仅有 相应c文件里的函数和变量的声明,和相应c文件无关的东西不应该有。 二、关于头文件的包含: 头文件的包含就比较简单了:在相应c文件里一一包含所需的h文件即可。但千万不要将这些头文件全部放在c文件的相应头文件里,虽然这样会使c文件仅包含了一个头文件,看起来比较简洁,但这样会影响它的h文件的“纯洁性”。 在此提醒下新手们:要将c文件和其对应的h文件看成一体,即它们互相有着紧密联系;移植时,将它们同时搬走就行! 三、关于结构体类型的定义: 1、若结构体类型只需要在某个c文件中使用,那么就在相应c文件里定义该结构体即可。 2、若结构体类型要在多个c文件中使用,那么就应该在头文件中定义该结构体,再在要用它的文件中包含结构体定义 所在的头文件即可。 最后,相信很多人都遇到过上述困惑吧,但愿本文能为你解惑! |
|
相关推荐
|
|
|
|
|
|
|
|
2201 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2027 浏览 3 评论
4633 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2171 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2705 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 18:17 , Processed in 0.507128 second(s), Total 43, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号