[转帖]输出宏的内容

   宏在C/C++程序中使用的非常之多,是代码自动化生成的利器,但在跟踪调试时宏却又成了负担,宏展开的代码很多时候都出人意料。把展开后的宏输出,是分析宏的好方法。
下面先介绍宏的“#”操作符
define MACRO_(x)  #x
这个MACRO_宏就是把参数x转化为字符串,看下面的例子
1  #define     MACRO_(x)    #x
2  int  main( int  argc , char *  argv[] )
3  {
4      printf( " %s " ,MACRO_(printf));
5       return   0 ;
6  }

输出:
printf
如果参数x是个宏呢,那么输出的会是什么呢,是宏的名字还是展开后的宏代码
1  #define     MACRO_(x)    #x
2  #define  HELLO        "Hello World"
3  int  main( int  argc , char *  argv[] )
4  {
5      printf( " %s " ,MACRO_(HELLO));
6       return   0 ;
7  }
上面这段代码是输出:HELLO,还是Hello World呢?
如果是Hello World那么我们的目的也就达到了,输出了展开后的宏代码
但事与愿违,上面代码输出的是HELLO,因为#操作符会把后面的参数强制转为字符串,遇到宏是不会展开的。
这个方法失败,既然#可以把它后面的参数变为字符串,那么我们必须保证在宏遇到#操作符之前就是展开的。这样我们还需要定义一个辅助的宏,用来用来让参数宏展开。
1  #define     MACRO_(x)        #x
2  #define  HELLO            "Hello World"
3  #define     SHOWMACOR(mac)    MACRO_(mac)
4  int  main( int  argc , char *  argv[] )
5  {
6      printf( " %s/n " ,SHOWMACOR(HELLO));
7       return   0 ;
8  }

这样输出的就是展开后的:"Hello World"了
我们来分析SHOWMACOR展开的过程
第一步变为:MACRO_(HELLO)
 上面的表达式中没有出现#,那么先是括号中的HELLO展开
第二步变为:MACRO_("Hello World")
最后MACRO_展开变为:#"Hello World"
所以输出为:"Hello World"  

 

引用:http://www.cppblog.com/loky/archive/2008/04/08/46503.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值