C语言:宏定义的妙用

一、定义别名标识符

在代码中为了提高可读性,把一些数字进行宏标识化,同时也方便后续修改(一处修改,到处生效),

#define  YEAR_COUNT_SEC    (365*24*60*60)UL

二、连接符“\”

static u32 DO_AND_RETRY_try_cnt;
#define DO_AND_RETRY(func, target, try, success, fail)      do {                                \
                                                                DO_AND_RETRY_try_cnt = (try);   \
                                                                while (DO_AND_RETRY_try_cnt)    \
                                                                {                               \
                                                                    --DO_AND_RETRY_try_cnt;     \
                                                                    if ((func) == target)       \
                                                                    {                           \
                                                                        success;                \
                                                                        break;                  \
                                                                    }                           \
                                                                    else                        \
                                                                    {                           \
                                                                        fail;                   \
                                                                    }                           \
                                                                }                               \
                                                            }while(0);
#define CREATE_APP(Name,Type)        \
	VControl Name##Ctrl={ \
						  #Name,            \
						  Type,             \
						  0,   \
						  0,           \
						  0,                \
						  Name##CmdMap,     \
						  0,             \
						  0,  \
						  {0,0,0,0},    \
						  0                 \
						};

三、宏函数

/**
     Get event if  event type.

     @param[in] e     Event value.
     @param[in] emin  Event minimum value.
     @param[in] emax  Event maximum value.

     @return
        - @b TRUE event is between minimun and maximun
        - @b FALSE event is out of range
*/
#define IN_RANGE_EVENT(e,emin,emax)       (((e) > (emin)) && ((e) < (emax)))

#define MAX(X, Y)                         ((X) > (Y) ? (X) : (Y))

#define MIN(X, Y)                         ((X) < (Y) ? (X) : (Y))

四、字符连接与串化

字符连接:##

##操作可应用在变量定义中,若程序开发中遇到要定义一大堆变量,且这些变量具有相同的前缀时,##很显得尤为重要,它可以使代码更加整洁,且减少了出错的机率。同时,方便批量修改前缀。

#include <stdio.h>

#define tokenpaster(n) printf ("token" #n " = %d\n", token##n)

int main(void)
{
   int token34 = 40;
   
   tokenpaster(34);
   return 0;
}

输出:token34 = 40

字符串化:#

#include <stdio.h>

#define  message_for(a, b)  \
    printf(#a " and " #b ": We love you!\n")

int main(void)
{
   message_for(Carole, Debra);
   return 0;
}

输出:Carole and Debra: We love you!

#操作符可用于调试时将变量名输出,可配合##一起使用,

如定义#define CHECK_VAR(x,fmt) printf(#x " = " #fmt "\n", x),则CHECK_VAR(var1,%d)相当于printf("var = %d\n", var1);

五、@# 字符化操作符

就是将参数字符化

#define toChar(x)  #@x

如果a = toChar(b),那么展开为:a = 'b';(可能早期编译器不支持)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值