用宏来生成代码

 

在很多教科书里,宏作为典型的反面教材,备受诟病。确实在很多方面宏扮演着很不光彩的角色,完全应该被其它的代码方式所取代(例如const变量,函数)。但是在对于处理重复机械的代码的自动代码生成方面,宏却能发挥意想不到的作用,而且是其它方式例如函数所无法取代的。例如MFC,ATL的架构设计里就有大量的宏的应用。下面我就列举一些宏生成代码的例子


1.
计算数组大小:好多时候,程序员都会混淆在计算静态数组元素个数和尺寸。


我们在做 产品支持UNICODE的时候,有很多crash 的bug就是这个原因引起的,


这时候下面这个宏用起来就很方便(<<程序设计实践>>一书所介绍)。


#define NELEMS(elems)
sizeof(elems) / sizeof(elems[0])


这个宏返回的就是静态数组 元素个数。和数组类型无关,并且它的计算结果是在编译期就完成的,不会带来运行期的计算负担。

2.
指针 / 动态数组的删除:分配的指针数组用完之后我们一定要进行删除,否则会引起内存漏洞,对于指针和数组,他们的删除方式又不一样:
删除指针: delete pointer; 删除数组 : delete[] array;
好多程序员往往混淆这两者的使用,在删除数组的时候,调用 delete array, 从而不知不觉导致了内存漏洞 . 而且为了防止野指针的使用,我们在删除之后,最好将指针置为 NULL 下面两个宏就很有帮助作用。

//
删除指针宏
#define DELEM(elem)/
if (elem)/

{/

delete elem;/

elem = NULL;/

}


//
删除动态数组宏
#define DELEMS(elems)/
if (elems)/

{/

delete[] elems;/

elems = NULL;/

}

另外根据代码大全上的建议,如果我们想防止其它野指针访问这块内存,将这块内存数据清零的话,那么只要在这段宏的内存释放代码之前,相应加上即可。 memset(elem, sizeof(elems), 0), memset(elems, sizeof(elems), 0).

3.
私有成员数据的访问 / 设置:经常我们写的类有很多私有数据,为了访问设置这些私有成员,我们不得不为每个私有成员数据写如下类似的函数:
int GetX()const { return X; },
void SetX(int x){ X = x; }
对于字符指针类型的私有成员数据,
Char* GetX() const{ return X; }
void SetX(Char* x){ copy_string(&X, x) }
如果这样的私有数据成员很多的时候,写这样的函数非常的繁琐累人,为了简单省事,我设计以下两个宏来处理类似情况:
#define ACCESSMEMBER(membertype, membername, member) /
membertype Get##membername() const { return member; } /
void Set##membername(membertype m) /
{ /
member = m;/

}
#define ACCESSSTR(strname, memberstr) /
LPTSTR Get##strname() const { return memberstr ;} /
void Set##strname(LPCTSTR strval) /
{ /
copy_string(&memberstr, strval);/

}
比如你的类里有个私有成员变量为 BOOL m_bPresenter, 你要为其添加访问设置函数的话,只要在类的定义里添加一行 ACCESSMEMBER(BOOL, Presenter, m_bPresenter) 即可,这个宏自动会为你生成两个函数
void SetPresenter(BOOL m ){ m_bPresenter= b;}
BOOL GetPresenter() const { return m_bPresenter; }
从而大大简化了这一繁缛程式化的工作。

以上我就宏的使用,举了几个例子,在平常开发过程中我们可以根据实际情况,来设计自己的宏,从而可以大大简化那些重复机械化的工作,取得一些意想不到的方便。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值