商业机会 产品大全 企业名录 我商务中心 | | 手机站 网址:xadnitpx2.qy6.com C++语言中宏列表介绍_西安达内科技
西安达内科技
联系人:西安达内 先生 (seo)
电 话:029-82222601
手 机:

产品目录

C++语言中宏列表介绍

留言询价
详细说明

    西安达内培训(http://www.xatarena.net)讲师表示,C中的一个惯用方法,是说有一个已命名的实体列表,需要为它们中的每一个建立函数,将它们中的每一个初始化,并在不同的代码模块中扩展它们的名字。这在Mozilla的源码中经常用到,我就是在那时学到这个技巧的。例如,在我去年夏天工作的那个项目中,我们有一个针对每个命令进行标记的宏列表。其工作方式如下:



#define FLAG_LIST(_)

_(InWorklist)

_(EmittedAtUses)

_(LoopInvariant)

_(Commutative)

_(Movable)

_(Lowered)

_(Guard)



它定义了一个FLAG_LIST宏,这个宏有一个参数称之为 _ ,这个参数本身是一个宏,它能够调用列表中的每个参数。举一个实际使用的例子可能更能直观地说明问题。假设我们定义了一个宏DEFINE_FLAG,如:



#define DEFINE_FLAG(flag) flag,

enum Flag {

None = 0,

FLAG_LIST(DEFINE_FLAG)

Total

};

#undef DEFINE_FLAG

对FLAG_LIST(DEFINE_FLAG)做扩展能够得到如下代码:



enum Flag {

None = 0,

DEFINE_FLAG(InWorklist)

DEFINE_FLAG(EmittedAtUses)

DEFINE_FLAG(LoopInvariant)

DEFINE_FLAG(Commutative)

DEFINE_FLAG(Movable)

DEFINE_FLAG(Lowered)

DEFINE_FLAG(Guard)

Total

};

接着,对每个参数都扩展DEFINE_FLAG宏,这样我们就得到了enum如下:



enum Flag {

None = 0,

InWorklist,

EmittedAtUses,

LoopInvariant,

Commutative,

Movable,

Lowered,

Guard,

Total

};

接着,我们可能要定义一些访问函数,这样才能更好的使用flag列表:



#define FLAG_ACCESSOR(flag)

bool is##flag() const {

return hasFlags(1 << flag);

}

void set##flag() {

JS_ASSERT(!hasFlags(1 << flag));

setFlags(1 << flag);

}

void setNot##flag() {

JS_ASSERT(hasFlags(1 << flag));

removeFlags(1 << flag);

}



FLAG_LIST(FLAG_ACCESSOR)

#undef FLAG_ACCESSOR



一步步的展示其过程是非常有启发性的,如果对它的使用还有不解,可以花一些时间在gcc –E上。

 
西安达内科技
西安达内 先生 (seo)  
电  话: 029-82222601
传  真:
移动电话:
公司地址: 中国陕西西安市陕西省西安市兴庆南路10号交大出版大厦6层
邮  编:
公司主页: http://xadnitpx2.qy6.com.cn(加入收藏)
 



其它商业信息
 1 直接到第
5 条信息,当前显示第 1 - 5 条,共 1

公司首页 | 公司介绍 | 产品展示 | 供求商机 | 诚信档案 | 联系方法 | 加入收藏
西安达内科技 公司地址:中国陕西西安市陕西省西安市兴庆南路10号交大出版大厦6层
西安达内 先生 (seo) 电话:029-82222601 传真:
免责声明: 以上所展示的信息由会员自行提供,内容的真实性、准确性和合法性由发布会员负责,企业录对此不承担任何责任。如有侵犯您的权益,请来信通知删除。

机械 仪器 五金 电子 电工 照明 汽摩 物流 包装 印刷 安防 环保 化工 精细化工 橡塑 纺织 冶金 农业 健康 建材 能源 服装 工艺品 家居 数码 家电 通讯 办公 运动、休闲 食品 玩具 商务 广告 展会 综合
提供服务支持 © 企业录 | 移动端