注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小可尼の博客

Linux后端的技术窝窝

 
 
 

日志

 
 

关于c语言宏定义中的单#(井号)和双#(井号)  

2014-02-20 10:41:55|  分类: C语言的宏定义 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

出处:http://www.cnblogs.com/cyttina/archive/2013/05/11/3072969.html

 

看了这篇文章后了解了,但是文章中的例子比较特别,我在这里加个注释好了。

http://www.cnblogs.com/welkinwalker/archive/2012/03/30/2424844.html


 宏定义中的井号
1)# 只在有参数的定义时用到,为把参数产开并转化成字符串即用""引起来。里面的空格分割全部改为一个,并且会自动添加转义字符'\'
2)##可以用于有无参数都行。它作用就是把##前后连个东西连起来形成新的标示符。
3)#@和#类似,只不过是用''引起来。

比如文章中的例子:

#define PRINT(NAME) printf("token"#NAME"=%d\n", token##NAME)

调用时候使用: PRINT(9);
宏展开即为: printf("token"#9"=%d\n",token##9);
#9即为"9",token##9即为: token9
整个为: printf("token""9""=%d\n",token9);
之前定义过token9为9,所以就是输出 token9=9;
解释到这里应该就明白单#和双#怎么用了。附上代码,还是摘自上面的连接。

 

#include <iostream>
void quit_command(){
    printf("I am quit command\n");
}  
void help_command(){
    printf("I am help command\n");
}  
struct command
{
    char * name;
    void (*function) (void);
}; 
#define COMMAND(NAME) {#NAME,NAME##_command}
#define PRINT(NAME) printf("token"#NAME"=%d\n", token##NAME)
main(){
    int token9=9;
    PRINT(9);
    struct command commands[] = {
        COMMAND(quit),
        COMMAND(help),
    }; 
    commands[0].function();
}

 

代码中还有一点就是调用那个函数指针的部分。解释一下,COMMAND宏定义是有{}的,第一个#NAME,就是赋值给结构体command的char *name,第二个 NAME##_command,用来拼出函数名,赋值给结构体中的函数指针,之后在commands[0].function()中通过函数指针来调用函数。

  评论这张
 
阅读(325)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018