VC 中预处理指令与宏定义的妙用(2)

ZDNet软件频道 时间:2002-07-09 作者:刘巍 |  我要评论()
本文关键词:
在上一篇文章中,我演示了几个常用的宏定义和预处理指令,但可以说这些都是相当常规的技巧。下面要介绍的宏定义与预处理指令的用法也是ATL,MFC以及LINUX中使用得比较多的非常重要的技巧。
几小小的警告

正如微软声称的一样,宏定义与预编译器指令是强大的,但是它又使得程序难以调试。所以在定义宏的时候不要节省你的字符串,一定要力争完整的描述这个宏的功能。同时在定义宏的时候如有必要(比方使用了if语句)就要使用dowhile(0)将它封闭起来。在宏定义的时候一定要注意各个宏之间的相互依赖关系,尽量避免这种依赖关系的存在。下面就有这样一个例子。

设有一个静态数组组成的整型队列,在定义中使用了这样的方法:

int array[]={5, 6, 7, 8};

我们还需要在程序中遍历这个数组。通常的做法是使用一个宏定义

#define ELE_NUM 4

…………………………..

……………………………..

for(int I=0;I<ELE_NUM;I++)

{

       cout<<array[I];

}

由于某种偶然的原因,我们删除了定义中的一个元素,使它变成:

array[]=

而却忘了修改ELE_NUM的值。那么在上面的代码中马上就会发生访问异常,程序崩溃。然后是彻夜不眠的调试,最后发现问题出在这个宏定义上。解决这个问题的方法是不使用

array[]=这样的定义,而显式的申明数组的大小:

array[ELE_NUM]=

这样在改动数组定义的时候,我们就不会不记得去改宏定义了。总之,就是在使用宏定义的时候能够用宏定义的地方统统都用上。

我发现的另一个有趣的现象是这样的:

假设现在有一个课程管理系统,学生的人数用宏定义为

#define STU_NUM 50

而老师的人数恰好也是50人,于是很多人把所有涉及到老师人数的地方通通用上STU_NUM这个宏。另一个学期过去,学生中的一个被开除了,系统需要改变。怎么办呢?简单的使用#define STU_NUM 49 么?如果是这样,一个老师也就被开除了,我们不得不手工在程序中去找那些STU_NUM宏然后判断它是否是表示学生的数目,如果是,就把它改成49。天哪,这个宏定义制造的麻烦比使用它带来的方便还多。正确的方法应该是为老师的数目另外定义一个宏:

#define TEA_NUM 50

当学生的数目改变以后只要把STU_NUM 定义为49就完成了系统的更改。所以,当程序中的两个量之间没有必然联系的时候一定不要用其中的一个宏去替代另一个,那只会让你的程序根本无法改动。

最后,建议C/C++语言的初学者尽可能多的在你的程序中使用宏定义和预编译指令。多看看MFC,ATL或者LINUX的源代码,你会发现C语言强大的原因所在。


刘巍 - 高级程序员、软件设计师,精通VC,VB,COM,PLATFORM SDK,DDK,TCP/IP。独立开发过多种windows应用程序,WDM USB驱动程序,网络应用程序。熟悉加密技术,熟悉LINUX下的C/C++开发。


责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134