browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

随想:宏与125元

Posted by on 2003 年 08 月 25 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

今年7月初,我作为课程设计的一名负责人,领导了一个连我在内4人的开发团队,开发了一个简易的“航班订票系统”。我定义了所需的数据结构,包括这样一个struct:

1
2
3
4
5
typedef struct _passenger
{
    /* 乘客数据,略去 */
    struct _passenger * next;
} PASSENGER, *PPASSENGER;

这之后每每要新建结点的时候,都得这么写:

PPASSENGER p = (PPASSENGER)malloc( sizeof( PASSENGER ) );

这一长串的代码使我厌烦,我便灵机一动,借用了C++之中operator new的形式,在我的头文件中写下了如下的一个宏:

#define NEW( type, count ) (type *)malloc( sizeof( type ) * count )

于是,我新建结点的代码便成了:

PPASSENGER p = NEW( PASSENGER, 1 );

足足少用了20个字符,我极为得意,自认为这是我十年来写下的最有创意的代码之一。

也许有的朋友不以为意,认为这算不了什么。那么请听我算上一笔帐吧:假如我是一个程序员,打字速度是1ch/s(当然慢得过分了,好在是假设),而我的身价奇高,挣钱速度是1RMB/s。以此计算,如果我在我的程序中需要写10行新建结点的代码,那么这个宏将为我节省20 * 10 – 75 = 125 (s)的时间(注:所谓75s,为加上NEW宏中换行符之后的回车符之故)。换算成人民币,就是125元。

正是以上的这件小事,成为了我这《随想》的缘起。

C++之父Bjarne Stroustrup曾经说过,绝不应该去使用宏,除非你不得不这样做。是的,自C诞生以来,宏便承载了太多的大是与大非——很多精巧的设计来自于令人拍案叫绝的宏,比如微软MFC类库中的消息映射;很多难以察觉的错误亦是来自于斯,比如这个老掉牙的例子:

1
2
3
#define macro( a, b ) a * b
int x = macro( 2, 3 ); // x == 2 * 3 == 6
int y = macro( 1 + 1, 3 ); // y == 1 + 1 * 3 == 4

C++之中倒是为宏设计了替代品:const常量、inline函数与模板。比如以下的宏:

#define NULL 0

在C++中就可以用以下的代码代替:

const int NULL = 0;

另外,还有宏函数:

#define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )

也可以由inline模板函数代替:

1
2
3
4
template < typename T > inline max( const T& a, const T& b )
{
    return ( ( a > b ) ? a : b );
}

如此说来,宏倒大有被取代之势了。

不过,宏所能给我带来的那125元的收益,却是const、inline和template不能取代的。

订阅本站

5 Comments

  • At 2006.03.31 14:02, Kindy said:

    “身价奇高”.让我来算算你心目中的“身价奇高”是个什么数字,呵呵,先请别介意。
    每天工作8小时,每小时60分钟,每分钟60秒,得到8*60*60 = 28800。
    一个月工作4个星期,每星期工作5天,4*5 = 20。
    所以,你一个月的工资应该是: 28800*20 = 576000。
    挺吓人的一数字哦,呵呵。
    不过使用宏确实很能节省程序员的代码量。谢谢分享。

    • At 2006.04.27 10:53, ztwaker said:

      深入去了解吧……

      • At 2006.07.21 15:43, 土星 said:

        这么算啊?你的意思是你可以不停的产出代码?
        我认为一天能产出30行代码就不错了:)

        • At 2008.05.02 01:27, NULL said:

          请教一下
          如果
          #define macro( a, b ) a * b
          int y = macro( 1 + 1, 3 ); // y == 1 + 1 * 3 == 4

          改成inline 的会出现那种情况么?

          • At 2008.05.02 02:12, 李马 said:

            To NULL:
            既然编译器在手边,为什么不亲手试试呢?:)

            (Required)
            (Required, will not be published)