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()