C语言:“宏定义”的使用经验和技巧

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/credolhcw/article/details/54755411

“宏”只是简单的替换


替换 malloc 语句:


格式:

#define MyMacro(a1,a2,...,an) ( STATEMENT )

在C程式中,经常会用到动态申请内存的语句:

    (int*)malloc(sizeof(int)*n);

这样写不仅不够美观,而且相对来说不能够直观的反应出申请的空间大小,不如用一个简单的宏定义让代码更加易读:

    #define MALLOC(type, size) \
    ( (type*)malloc(sizeof(type) * (size)) )

替换 函数块


格式:

#define MyMacro(a1,a2,...,an) ( STATEMENT )

举个例子,要求计算给定的两个整数的最大公因数,算法如下:

int _GCF( int a, int b )
{
    /*
     * 初始条件:a > b
     */

    if( b == 0 ) return a;
    else return _GCF(b,a%b);
}

由于初始条件要求“a>b”,可以用一个宏定义加以控制:

    #define GCF(a,b) ( (a>b)? _GCF(a,b): _GCF(b,a) )

通过这个宏定义就可以很方便的调用这个功能。


替换 多行函数块


格式:

#define MyMacro(a1,a2,...,an) \
    do { \
        STATEMENT 1; \
        STATEMENT 2; \
        ...
        STATEMENT n; \
    )while(0)

我开始学习算法的时候,碰到一个计算给定整数序列的全排列的题目,代码如下:

int _ALL_RANGE( int *a, int is, int ie, STACK *s, int flag )
{
    /*
     * a: 给定整数数组的首地址
     * s: 存储结果的栈的地址
     * flag: 是否打印终端的标志
     */

    int i,tmp;
    if( is == ie ) {
        pushS(s,a); // 结果入栈
        if( flag == 1 ) {
            打印该结果;
        }
    }
    else {
        for( i=is; i<=ie; i++ ) {
            swap(a[i],a[is]; // 交换a[i]和a[is]的值
            _ALL_RANGE(a,is+1,ie,s,flag);
        }
    }
}

当时准备调用这个函数的时候,发现传入的参数中栈指针s可能只是个空指针为,因此在发现是个空指针时需要先调用createS()函数构造一个栈。为了让算法更简明没有多余的语句,我采用的宏定义的方式:

#define ALLRANGE(a,n,s,f) \
    do { \
        if( (s) == null_ptr ) { \
            (s) = createS(n); \
    } while(0)\         

注:为了保持整体风格的一致 } while(0) 后不需要加”;”。

猜你喜欢

转载自blog.csdn.net/credolhcw/article/details/54755411
今日推荐