MFC中支持运行时类型识别与动态创建。这更多的是设计问题。理解了其中的设计,可以更快定位用MFC框架开发的代码。通过研究MFC实现这些的细节,可以更快地掌握其他开发框架的设计思想。
宏定义中的"#"与 “##”
MFC框架大量使用了宏定义来“自动”完成框架的声明与实现工作。因此首先复习下宏中的#与##功能是有必要的。
“#”
单独的一个#符号,作用是“字符串化”,比如:
#define ToString(x) #x
则有:
int main()
{
//相当于printf("%s\r\n", “Hello, world!”);
printf("%s\r\n", ToString(Hello, world!);
}
有些框架中会利用这样的字符串化,形成字符常量到字符串的映射,比如,用这样的方法制作消息响应表:
struct tagMsgMap {
int nMsg;
char *szMsg;
};
#define MSG_ENTRY(Msg) {Msg, #Msg}
tagMsgMap g_MsgMapEntry[]= {
MSG_ENTRY(WM_COMMAND),
MSG_ENTRY(WM_KEYUP),
…
};
“##”
"##"的作用常被解释为“连接符”,其实从其存在目的解释,说成“分隔符”也不算错。因为设计它的目的之一就是用来解决某些情况下不能用空格来分隔宏定义的问题。比如:
#define PRE(name) prefix_##name
以上的例子,若将##换成空格,则prefix_