宏——#define与#undef
宏定义是在程序编译前的预处理阶段,对所有使用到宏的地方进行替换;
今天看到代码里面一大推的 #define与#undef的使用,却不甚明白看了好一阵子才弄清楚是干什么的,其实很简单。
定义:
#define PROCESS_TYPE_DEF_SAME_DELETE() PROCESS_TYPE_BASIC_DEF(UMS_PROCESS_TYPE_SAME_DELETE, same_delete)
#define PROCESS_TYPE_DEF_GET_SAME_LIST() PROCESS_TYPE_BASIC_DEF(UMS_PROCESS_TYPE_GET_SAME_LIST, get_same_list)
同一类型的处理动作(很多简单列举)
#define ALL_PROCESS_TYPE_DEF \
PROCESS_TYPE_DEF_SAME_DELETE() \
PROCESS_TYPE_DEF_GET_SAME_LIST() \
……
#define REQ_HANDLER(tag) srv_um_##tag##_req
#define RSP_HANDLER(tag) srv_um_##tag##_rsp
使用:
#undef PROCESS_TYPE_BASIC_DEF
#define PROCESS_TYPE_BASIC_DEF(type, tag) \
S32 REQ_HANDLER(tag)(ums_process_struct *process); \
S32 RSP_HANDLER(tag)(ums_process_struct *process, RSP_STRUCT(tag) *inMsg);
ALL_PROCESS_TYPE_DEF
接着:
#undef PROCESS_TYPE_BASIC_DEF
#define PROCESS_TYPE_BASIC_DEF(type, tag) \
{sizeof(PARA_STRUCT(tag)), \
sizeof(CNTX_STRUCT(tag)), \
sizeof(RESULT_STRUCT(tag)), \
REQ_HANDLER(tag), \
(S32 (*)(ums_process_struct* , void*))RSP_HANDLER(tag)},
static const ums_process_type_table_struct ums_process_type_tbl[UMS_PROCESS_TYPE_MAX] =
{
ALL_PROCESS_TYPE_DEF //初始化一个数组
};
紧接着:
#undef PROCESS_TYPE_BASIC_DEF
#define PROCESS_TYPE_BASIC_DEF(type, tag) \
MMI_BOOL srv_um_recv_##tag##_rsp(void *inMsg) \
{ \
RSP_STRUCT(tag) *rsp = inMsg; \
if (rsp->app_id != 0) \
{ \
return MMI_FALSE; \
} \
srv_um_response_handler(type, inMsg); \
return MMI_TRUE; \
}
ALL_PROCESS_TYPE_DEF //定义一系列相似的函数
从上面可以看出:
#undef就是取消一个宏的定义,之后这个宏所定义的就无效;
但是可以重新使用#define 进行定义。