预览加载中,请您耐心等待几秒...
1/3
2/3
3/3

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

宏定义中的"#"和"##"的区别BOOLWINAPIMain_Proc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam){switch(uMsg){//BEGINMESSAGECRACKHANDLE_MSG(hWnd,WM_INITDIALOG,Main_OnInitDialog);HANDLE_MSG(hWnd,WM_COMMAND,Main_OnCommand);HANDLE_MSG(hWnd,WM_CLOSE,Main_OnClose);//ENDMESSAGECRACK}returnFALSE;}这个知道吧对话框里的一段。这段的解读,老鸟就不用看了呵呵。首先我们会感到奇怪,为什么switch啊又没case。这个时候你去头文件定义那里看看#defineHANDLE_MSG(hwnd,message,fn)\case(message):returnHANDLE_##message((hwnd),(wParam),(lParam),(fn)找到啦。看这个就是吧宏替换了我分析....HANDLE_##message奇怪中间怎么是##这个是干什么的啊以前没见过啊(我没见过就大家不知道怎么样可能我太菜了)。不怕,我去查查百度,找到了。哈~~~宏定义中的"#"和"##"的区别刚才测试了宏定义中的"#"和"##"的区别,希望能对大家有点帮助。结果如下:"#"代表和一个字符串相连接"##"代表和一个符号连接,符号可以是变量,或另一个宏符号。举例如下:宏定义如下(1)#defineDEV_FILE_NAME"/dev/test_kft"#defineOPEN_FILE(fd,n)\{\fd=open(DEV_FILE_NAME#n,O_RDONLY);\if(fd<0)\{\printf("Opendeviceerror\n");\return0;\}\}如此调用:OPEN_FILE(fd1,1);OPEN_FILE(fd2,2);用gcc-E展开后,如下2299:{fd1=open("/dev/test_kft""1",00);if(fd1<0){printf("Opendeviceerror\n");return0;}};2300:{fd2=open("/dev/test_kft""2",00);if(fd2<0){printf("Opendeviceerror\n");return0;}};如果没有定义DEV_FILE_NAME,就是2299:{fd1=open(DEV_FILE_NAME"1",00);if(fd1<0){printf("Opendeviceerror\n");return0;}};2300:{fd2=open(DEV_FILE_NAME"2",00);if(fd2<0){printf("Opendeviceerror\n");return0;}};所以可以很清楚的看出#n解析出来的是"n",用于连接一个已有的字符串。(2)再来看##是什么意思,宏定义如下:#defineOPEN_FILE(fd,n)\{\fd=open(DEV_FILE_NAME##n,O_RDONLY);\if(fd<0)\{\printf("Opendeviceerror\n");\return0;\}\}调用方式相同。看宏展开:2299:{fd1=open(DEV_FILE_NAME1,00);if(fd1<0){printf("Opendeviceerror\n");return0;}};2300:{fd2=open(DEV_FILE_NAME2,00);if(fd2<0){printf("Opendeviceerror\n");return0;}};现在看清楚了,##n的作用是把n直接连接在了一个符号的末尾.好,现在我们定义一个符号看看效果。#defineDEV_FILE_NAME1"/dev/test_kft1"再展开:2299:{fd1=open("/dev/test_kft1",00);if(fd1<0){printf("Opendeviceerror\n");return0;}};2300:{fd2=open(DEV_FILE_NAME2,00);if(fd2<0){printf("Opendeviceerror\n");return0;}};很显然第一个符号被替换了,因为是符号是宏的缘故。这样我们也能把这一扩展特性应用在变量上。