一、定义别名标识符
在代码中为了提高可读性,把一些数字进行宏标识化,同时也方便后续修改(一处修改,到处生效),
#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';(可能早期编译器不支持)
标签:妙用,RETRY,定义,DO,##,C语言,try,event,define From: https://blog.51cto.com/u_13472468/6113670