Chinaunix首页 | 论坛 | 博客
  • 博客访问: 158989
  • 博文数量: 35
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 294
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-11 14:55
个人简介

努力奋斗的骚年!

文章分类

全部博文(35)

文章存档

2014年(19)

2013年(16)

分类: C/C++

2014-12-01 17:00:23

《C标准库》中中有这样两个宏实现:
#define    _STR(x)     _VAL(x)
#define    _VAL(x)     #x

#能够将十进制常量转换成字符串常量,如
            #define PASTE(n) "aa"#n
            main()
            {
               printf("%s\n",PASTE(15));        //将会输出aa15
            }
但是要将__LINE__转换成一个字符串常量时,需要扩展一个额外的处理层,因为__LINE__本身就是一个宏,宏定义里有用'#'或'##'的地方宏参数不会再展开,调用_
VAR(__LINE__)输出的结果为#__LINE__,不再展开,即为字符串__LINE__

而扩展后调用_STR(__LINE__)后,第一步将_STR(__LINE__)展开成_VAL(__LINE__,第二步会进行参数替换,传入实际参数替代形参,这里的参数也是个宏,即__LINE__,假设是15,第三步替换内层宏,_VAL(15)展开成#15,即字符串15

因为嵌套宏展开顺序是:替换外层宏,传入实际参数替代形参,替换内层宏。



    
阅读(1997) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~