分享uC/OS中全局变量定义的技巧

2020-01-01 17:54发布

本帖最后由 10xjzheng 于 2016-7-18 09:43 编辑

C语言全局变量的生命与定义 .pdf (723.58 KB, 下载次数: 110) 2016-7-18 09:33 上传 点击文件名下载附件 昨天师弟问拿了一个程序跟我说,师兄,为什么在h文件中定义会出现重复定义呢?但是我在前面的按键模块化给出的例程中就可以在h文件中定义变量而且不会出现错误呢?如下图所示,我定义了一个控制时间片的全局数组Task_Delay[NumOfTask],这个数组的声明和定义只有在include.h,然后c文件如果要用到这个数组只要#include"include.h"就可以了。
首先来说下为什么一般方法在h文件中定义变量会出现错误。include这个操作相当于把h文件整个放到#include这个文件的地方,那么如果你在一个h文件里面定义一个变量,并且把这个h文件include到不同的c文件中去,那么不同的c文件都有这个定义了!自然会出现重复定义的错误。那么为什么我就可以呢?因为我在定义这类全局变量的时候在其前面加了TASK_EXT,如上图所示,如果这样子可以,那么就很方便全局变量的定义,不然搞到要一个C文件进行定义,多个文件进行声明,这里一个就搞定。但是别玩过火了,所有的变量都这样子搞会搞死你自己的,因为全局变量定义一多,这个工程一复杂,有时调试起来就不说很方便,都不知道哪里修改了这个变量,调试了半天,才知道原来某个C文件也有代码修改这个变量。以为这个技巧是从μC/OS-III里面学到的,我之前刚好写过,下面就摘抄出来给大家看看。

QQ截图20160718093715.png (176 KB, 下载次数: 0) 下载附件 2016-7-18 09:32 上传

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
单飞
1楼-- · 2020-01-01 21:14
 精彩回答 2  元偷偷看……
19504643
2楼-- · 2020-01-01 22:32
我是在C文件里定义,h里面加 extern 声明,这样也只用包含h文件
security
3楼-- · 2020-01-01 22:49
单飞 发表于 2016-7-18 14:33
.h不都是这么写的吗?这样不就不会重定义了?

#ifndef __XXX_H

LZ 的问题点不在于头文件的重复包含问题,不属于防卫宏的问题。
问题在于 头文件内部 的全局变量定义,用宏来控制,使得引用这个头文件时,在唯一一个 C 文件内部的引用,可以被解释为变量定义,而其他地方的引用,统统为变量声明。

但其实,我个人不喜欢这种技巧
因为不直观,我宁愿我的代码傻一点。
justdomyself
4楼-- · 2020-01-02 02:44
security 发表于 2016-7-18 15:05
LZ 的问题点不在于头文件的重复包含问题,不属于防卫宏的问题。
问题在于 头文件内部 的全局变量定义,用 ...

赞同。。。
单飞
5楼-- · 2020-01-02 06:16
security 发表于 2016-7-18 15:05
LZ 的问题点不在于头文件的重复包含问题,不属于防卫宏的问题。
问题在于 头文件内部 的全局变量定义,用 ...

我宁愿把问题都变成c定义,h声明,h里定义的少用为好。
waterx3
6楼-- · 2020-01-02 07:08
 精彩回答 2  元偷偷看……

一周热门 更多>