带参的宏定义与消息分发实现

来源:互联网 发布:linq 查询重复数据 编辑:程序博客网 时间:2024/04/29 03:51

1.带参宏定义:

        #define 宏名(参数列表) 字符串: 宏定义是字符串替换不进行优先级控制

   例如:#define S(a,b) a*b,area=S(3,2);第一步被换为area=a*b; ,第二步被换为area=3*2; 类似于函数调用,有一个哑实结合的过程:

        正确的宏定义: #define S(a, b) (a)*(b)

        特殊说明:

         (1)宏名和参数的括号间不能有空格

         (2)宏只作替换,不做计算,不做表达式求解

         (3)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存

         (4)宏不存在类型,也没有类型转换。

         (5)函数只有一个返回值,利用宏则可以设法得到多个值

         (6)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)

2.消息分发:

               系统将运行过程中会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收         句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄        调用相应的窗口过程。


3.消息分发的简单实现:

            这里可以通过多层的宏定义实现函数定义和其if 语句,依次来进行消息的分发,找到相应的处理函数;


例:

#define BEGIN_MSG_TEST()\
public int OnMsgArrived(unsigned int msgId,const char* buff)\
{\

#define MSG_HANDLER(msgID, t_func)\
if(msgId == msgID)\
{\
return t_func(buff);\
}\

#define END_MSG_TEST() return 0;\
}


BEGIN_MSG_TEST()
MSG_HANDLER(10, onTest10);
MSG_HANDLER(11, onTest11);
END_MSG_TEST()


0 0