C语言宏定义的学习------一个宏代表一段代码

来源:互联网 发布:win7无法启动网络发现 编辑:程序博客网 时间:2024/06/05 19:03

开拓视野,以方便对代码的学习、研读和编写。

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
原创粉丝点击