开拓视野,以方便对代码的学习、研读和编写。
1\
#ifdef __MMI_BOOTUP_SCALE__#define MMI_APP_INIT(func) {U32 start_time, end_time;\
S8 func_name[] = #func;\
kal_get_time(&start_time);\
func;\
kal_get_time(&end_time);\
Trace2(TRACE_FUNC, "[BOOTUP SCALE]Function: %s Time: %d", func_name, (end_time-start_time));\
}
#else
#define MMI_APP_INIT(func) func
#endif
例子1,表示了此宏代表了 对一个方法的调用, 若没有定义此宏直接就是对方法的调用。
2\
#define SetProtocolEventHandler(func, event) \
mmi_frm_set_protocol_event_handler(event, (PsIntFuncPtr)func, MMI_FALSE)
例子2,表示了一个方法的宏,实际是对另外一个方法的调用;
个人认为是可以等价为
SetProtocolEventHandler(func, event)
{
mmi_frm_set_protocol_event_handler(event, (PsIntFuncPtr)func, MMI_FALSE);
}
代码实现的功能应该可以等价,但是在编译器处理和方法运行时不同:
(1)宏定义是在预编译的时候,就换成了对调用方法的替换;
(2)方法的表示,是在函数运行中,会有对方法调用时,堆栈与寻找函数地址等一系列的操作;
3\
#define RESOURCE_BASE_ENUM_BEGIN() \
typedef enum \
{ \
RESOURCE_BASE_FIRST_VALUE = 0, \
RESOURCE_BASE_RANGE(APP_WAP, 1500),
#define RESOURCE_BASE_RANGE(ap_id, count) \
ap_id, \
GET_RESOURCE_BASE(ap_id) = ap_id, \
GET_RESOURCE_MAX(ap_id) = ap_id + count - 1 // 注意此行没有逗号,而实际中的枚举,是利用外边的逗号;
#define RESOURCE_BASE_ENUM_END() \
RESOURCE_BASE_RANGE(APP_DEVAPP, 300), \
RESOURCE_BASE_RANGE(APP_DEFAULT_END, 1), \
RESOURCE_BASE_RANGE(END, 1) \
} RESOURCE_BASE_ENUM;
RESOURCE_BASE_ENUM_BEGIN()
#if defined(__MMI_MIIPTS__)
RESOURCE_BASE_RANGE(MIIPTS, 1000),#endif // defined(__MMI_MIIPTS__)
RESOURCE_BASE_RANGE(SRV_STATUS_ICONS, 300),
RESOURCE_BASE_RANGE(SRV_INFO_NUM, 100),
RESOURCE_BASE_RANGE(SRV_CONNECTS, 100),
/**************************************************************************************
* Declare resource ID range above
**************************************************************************************/
RESOURCE_BASE_ENUM_END()
例子3,是通过把“枚举定义的开始” 和 “枚举定义的结束”的代码,分别写在两个宏里面。
4\
/*
* Use these tow macro to get the resource base and resource end
*/
#define GET_RESOURCE_BASE(id) RESOURCE_BASE_##id
#define GET_RESOURCE_MAX(id) RESOURCE_BASE_##id##_END
例子4,通过方法名字的形式,来实现对宏变量的替换。