打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
宏定义中的 "#" 和 "##" 的区别
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
//BEGIN MESSAGE CRACK
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
//END MESSAGE CRACK
}
return FALSE;
}
这个知道吧  对话框里的一段。这段的解读,老鸟就不用看了 呵呵。
首先我们会感到奇怪,为什么switch啊  又没case  。这个时候你去头文件定义那里看看
#define HANDLE_MSG(hwnd, message, fn)    \
case (message): return HANDLE_##message((hwnd), (wParam), (lParam), (fn)
找到啦。看  这个就是吧  宏替换了   我分析....
HANDLE_##message  奇怪 中间怎么是##  这个是干什么的啊  以前没见过啊  (我没见过就  大家不知道怎么样  可能我太菜了)。不怕,我去查查百度,
找到了。哈~~~
宏定义中的 "#" 和 "##" 的区别 刚才测试了宏定义中的 "#" 和 "##" 的区别,希望能对大家有点帮助。
结果如下:
"#" 代表和一个字符串相连接
"##" 代表和一个符号连接,符号可以是变量,或另一个宏符号。
举例如下:
宏定义如下
(1)
#define DEV_FILE_NAME "/dev/test_kft"
#define OPEN_FILE(fd, n) \
{ \
fd = open(DEV_FILE_NAME #n,O_RDONLY); \
if(fd < 0) \
{ \
printf("Open device error\n"); \
return 0; \
} \
}
如此调用:
OPEN_FILE(fd1, 1);
OPEN_FILE(fd2, 2);
用gcc -E展开后,如下
2299: { fd1 = open("/dev/test_kft" "1",00); if(fd1 < 0) { printf("Open device error\n"); return 0; } };
2300: { fd2 = open("/dev/test_kft" "2",00); if(fd2 < 0) { printf("Open device error\n"); return 0; } };
如果没有定义DEV_FILE_NAME ,就是
2299: { fd1 = open(DEV_FILE_NAME "1",00); if(fd1 < 0) { printf("Open device error\n"); return 0; } };
2300: { fd2 = open(DEV_FILE_NAME "2",00); if(fd2 < 0) { printf("Open device error\n"); return 0; } };
所以可以很清楚的看出#n 解析出来的是"n" , 用于连接一个已有的字符串。
(2) 再来看 ## 是什么意思, 宏定义如下:
#define OPEN_FILE(fd, n) \
{ \
fd = open(DEV_FILE_NAME ##n,O_RDONLY); \
if(fd < 0) \
{ \
printf("Open device error\n"); \
return 0; \
} \
}
调用方式相同。
看宏展开:
2299: { fd1 = open(DEV_FILE_NAME1,00); if(fd1 < 0) { printf("Open device error\n"); return 0; } };
2300: { fd2 = open(DEV_FILE_NAME2,00); if(fd2 < 0) { printf("Open device error\n"); return 0; } };
现在看清楚了, ##n 的作用是把n直接连接在了一个符号的末尾. 好, 现在我们定义一个符号看看效果。
#define DEV_FILE_NAME1 "/dev/test_kft1"
再展开:
2299: { fd1 = open("/dev/test_kft1",00); if(fd1 < 0) { printf("Open device error\n"); return 0; } };
2300: { fd2 = open(DEV_FILE_NAME2,00); if(fd2 < 0) { printf("Open device error\n"); return 0; } };
很显然第一个符号被替换了, 因为是符号是宏的缘故。 这样我们也能把这一扩展特性应用在变量上。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
unix/Linux 低级IO函数的用法read && write
Pmem使用小结
Android"重力加速度传感器"从驱动到应用层全程分析
Android 浅谈Sensor工作流程(四)
嵌入式 C 语言宏配置的一些技巧
'/sys/devices'和'/dev'这两个目录下的文件的区别?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服