Chinaunix首页 | 论坛 | 博客
  • 博客访问: 682233
  • 博文数量: 85
  • 博客积分: 1797
  • 博客等级: 上尉
  • 技术积分: 1238
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 08:53
个人简介

职位:技术总监 1、精通c++(linux平台、vc++Mfc、qt)、java、php、unity3d,略懂python 2、用c++开发过嵌入式产品,用c++开发过大型银行运维产品 3、用java开发大型银行运维产品,学校教务系统 4、用php开发进销存系统(在销售中),用php开发淘宝小程序 5、用unity3d开发衣柜设计软件,在运营中

文章分类

全部博文(85)

分类: 嵌入式

2010-03-16 20:52:15

      这是以前从网上找的,对全局变量分析的很透彻,忘了哪个网址了,对不住作者了。
 
      在uC/OS-II的代码中,应用了一种让人耳目一新的全局变量定义方法。
      在《uC/OS-II》中,作者给出了解释,但是这里还是忍不住要讨论一番。
      我们知道,全局变量的使用有两个问题:
  • 1.要给它分配内存,并且只能分配一次。
  • 2.在其它模块中也要能通过extern关键字调用。
      按照平时的定义,如果安排得不好,总是会出问题,extern起来没完。而在uC/OS-II采用了一种比较聪明的做法。uC/OS-II中,每个.C文件都通过includes.h包含了所有的.H文件那么, uC/OS-II采用了下面的办法:

      每当定义全局变量时,首先做下面的定义:
#ifdef   xxx_GLOBALS
#define  xxx_EXT
#else
#define  xxx_EXT extern
#endif
 
      .H文件中每个全局变量都加上了xxx_EXT的前缀。xxx代表模块的名字。而在该模块的.C文件中有以下定义:
#define  xxx_GLOBALS
#include "includes.h"
比如,定义了 xxx_EXT  INT32U       g_xxx;
      这样,编译到xxx模块时,xxx_GLOBALS被定义,根据上面的预编译条件,这时候
xxx_EXT是空,从而
                xxx_EXT  INT32U       g_xxx;
等价于           INT32U                g_xxx;
这时候,变量被分配内存。
 
      当编译其它模块时,xxx_GLOBALS没有被定义,根据上面的预编译条件,这时候
xxx_EXT是extern,从而 
              xxx_EXT  INT32U       g_xxx;
等价于        extern   INT32U       g_xxx;
这时候,只是变量的外部引用。
 
      通过这种办法,使得全局变量只需在头文件中定义一次就可以了,避免了不少麻烦。
阅读(3486) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~