posts - 17,comments - 7,trackbacks - 0
   宏在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"
posted on 2008-04-08 13:58 。。。。 阅读(3608) 评论(5)  编辑 收藏 引用 所属分类: c++

FeedBack:
# re: 输出宏的内容
2008-04-08 18:00 | 亨德列克
高!  回复  更多评论
  
# re: 输出宏的内容
2008-04-08 20:14 | MagickWay
厉害,学了一手。  回复  更多评论
  
# re: 输出宏的内容
2008-04-21 12:55 | 刀刀
实际编程中有啥子用?玩弄技巧?还是等同于C#反射机制?  回复  更多评论
  
# re: 输出宏的内容
2009-03-12 12:02 | 徐刚辉
楼上的如此肤浅,鄙视之  回复  更多评论
  
# re: 输出宏的内容[未登录]
2015-09-13 09:16 | 路人甲
第一步不是SHOWMACOR么  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理