Linux mobile development

欢迎到Linux mobile development(www.limodev.cn)上交流。Limodev主要致力于基于linux的嵌入式系统的学习和研究,包括内核、驱动、GUI、MMI、软件设计方法和软件优化等方面,欢迎大家加入,无论是高手还是新手,一起学习共同进步。下载BLOG示例代码请先到limodev.cn/bbs上注册,谢谢

原创 神奇的xx宏收藏

转载时请注明出处和作者联系方式
作者联系方式:李先静 <xianjimli at hotmail dot com>


前段时间研究lcc,看见token.h里有这样一些代码:

xx(FLOAT,     1, 0,  0,    0,      CHAR,   "float")

xx(DOUBLE,    2, 0,  0,    0,      CHAR,   "double")

xx(CHAR,      3, 0,  0,    0,      CHAR,   "char")

xx(SHORT,     4, 0,  0,    0,      CHAR,   "short")

yy(0,           94,     7,      BXOR,   bittree,'^',    "^")

yy(0,           95,     0,      0,      0,      0,      0)

yy(0,           96,     0,      0,      0,      0,      0)

yy(0,           97,     0,      0,      0,      0,      0)


#undef yy

#undef xx

初看有点不解,xx到底是个什么东西呢?但从这些信息很容易想到,其中每一行描述一个token的信息。把代码大概看了一下,主要有以下几个地方引用到token.h:

在enode.c中:

Tree (*optree[])(int, Tree, Tree) = {

#define xx(a,b,c,d,e,f,g) e,

#define yy(a,b,c,d,e,f,g) e,

#include "token.h"

};
 

在expr.c中:

static int oper[] = {

#define xx(a,b,c,d,e,f,g) d,

#define yy(a,b,c,d,e,f,g) d,

#include "token.h"

};

在output.c中:

static char *tokens[] = {

#define xx(a,b,c,d,e,f,g) g,

#define yy(a,b,c,d,e,f,g) g,

#include "token.h"

};
 

看了这些代码,一下明了了作者的意图:把每个token相关的信息放在一起,便于集中管理,而在不同的地方,通过把xx/yy定义成不同功能的宏,以提取所需要的信息。称它为xx/yy,正是因为这两个宏在使用时还有没定义,在不同的上下文中,其功能是不同的。

我们做的是一个智能手机,在项目早期总会不断有新的AP加入进来,一个APP都很多描述信息,每次加入新AP时,总会遗漏某些信息没有加入,导致Autobuild失败,搞得我很烦,检查了一下相关的代码。发现AP具有下信息:

1.主窗口类

2.主窗口名

3.ID

4.名称

5.INF文件名

6.入口函数

7.资源

8.APP的说明

每一项的定义都在不同的地方,更麻烦的是,增加一个APP竟要4个人配合修改:模块负责人本人,负责修改PC和硬件的工程文件的人,负责加入APP的ID的人,负责加APP的入口函数及其它信息的人。尽管增加APP时用邮件通知了大家,但总有人忘了修改自己的负责的地方,所以常常让Autobuild编译失败。


看了lcc里的xx/yy的方式后,我想在一个地方统一管理这些信息可以避免不必要的麻烦,于用了这种方式去声明APP的信息,如:

#define ALL_APPS_LIST \

  xx("桌面",                 STATUSBAR_CLASS,         STATUSBAR_NAME,         DESKTOP_APPID,       DESKTOPAPPNAME,          DESKTOPWINMAININF,       DesktopWin,               desktop_res)\

  xx("名片",                 CARDCLASS,               CARDNAME,               CARD_APPID,          CARDAPPNAME,             CARDWINMAININF,          Card_WinMain,             card_res)\

  xx("电话",                 TELCLASS,                TELNAME,                TELEPHONE_APPID,     TELAPPNAME,              TELWINMAININF,           Telephone_WinMain,        tel_res)\

使用方式如下:

#undef  xx

#define xx(APP_NAME_COMMENT, WIN_CLASS, WIN_NAME, APP_ID, APP_NAME, APP_INF, APP_WINMAIN, APP_RES)  {(WIN_CLASS), (WIN_NAME)},

const AppClassWindow AppClassDefine[]=

{

       ALL_APPS_LIST

       {NULL,NULL},

};
 

#undef  xx

#define xx(APP_NAME_COMMENT, WIN_CLASS, WIN_NAME, APP_ID, APP_NAME, APP_INF, APP_WINMAIN, APP_RES)  APP_ID,

typedef enum tagAPPID_E

{

    ALL_APPS_LIST

    MAX_APPID

}APPID_E;

现在只要一个人维护这张表和工程文件,其它地方都不需要修改,至此之后一切平安无事。

最近研究ZX的手机开发平台,里面用了IMAGE_DEF/TEXT_DEF等实现了类似的功能,xx换成了更具明显意义的宏,给人感觉更直观一些。

 

 

发表于 @ 2005年08月27日 19:46:00|评论(loading...)

新一篇: 由项目死锁得到的教训 | 旧一篇: 文法和语言的分类

用户操作
[即时聊天] [发私信] [加为好友]
李先静
订阅我的博客
XML聚合  FeedSky
李先静的公告

BLOG评论请到


下载BLOG示例代码请先到上注册,谢谢。

文章分类
收藏
1.友情链接
0华清远见-嵌入式培训专家
aimself@CSDN(RSS)
directfb中文网站(RSS)
Eric's Little Hut
eye_of_back的专栏(RSS)
Linux Mobile Research
Phoenix@上海(RSS)
segments的专栏(RSS)
study's Blog(RSS)
tracestudio
伐木丁丁鸟鸣嘤嘤(RSS)
会飞的鱼的专栏(RSS)
创系的技术博客
小四的BLOG(RSS)
小马哥的博客(RSS)
开源电信(RSS)
御风剑客
新奇的BLOG
易军军的网络家
李吉群的专栏(RSS)
2.亲情链接
凤凰的幸福蓄水池(RSS)
我的相册
3.软界高手
Donald E. Knuth (RSS)
孟岩(RSS)
透明(RSS)
4.LinuxMobile
celinuxforum(RSS)
GPE(RSS)
maemo.org(RSS)
opensource.motorola
palowireless
5.XWindow
Jserv's blog(RSS)
Keith Packard(RSS)
6.技术资源
7.开源项目
freedesktop(RSS)
GNU(RSS)
GTK+(RSS)
matchbox(RSS)
pxa27x-linux/
8.我的BLOG镜像
absurd@chinaunix
absurd@msn
My English BLOG(RSS)
存档
Csdn Blog version 3.1a
Copyright © 李先静