龙战于野技能:在VC++中如何查看宏的展开?

来源:百度文库 编辑:高校问答 时间:2024/05/10 07:41:14
比如:
#define TEST_MACRO something
#define STR_CAT(s) "test string " ## s
#define STR_CAT2(s) STR_CAT(s)
想看看宏
STR_CAT2(TEST_MACRO)
的展开结果(最好也能看展开过程)该怎么做?
主要是VC++下怎么做(应该是怎样只预处理而不编译),当然,如果其他编译器也能介绍一下就更好了
本人不常上网,但一定会过来看看的,有合适的答案一定给分!谢啦

LST文件在哪里,编译后没有看到!

当程序编译时,编译器首先要执行一个“替换”源程序的动作,把宏引用的地方替换成宏定义的语句块,就像文本文件替换一样。

很多程序员不知道C中的“宏”到底是什么意思?特别是当宏有参数的时候,经常把宏和函数混淆。我想在这里我还是先讲讲“宏”,宏只是一种定义,他定义了一个语句块,当程序编译时,编译器首先要执行一个“替换”源程序的动作,把宏引用的地方替换成宏定义的语句块,就像文本文件替换一样。这个动作术语叫“宏的展开”
使用宏是比较“危险”的,因为你不知道宏展开后会是什么一个样子。例如下面这个宏:
  #define MAX(a, b)   a>b?a:b
当我们这样使用宏时,没有什么问题: MAX( num1, num2 ); 因为宏展开后变成 num1>num2?num1:num2;。但是,如果是这样调用的,MAX( 17+32, 25+21 ); 呢,编译时出现错误,原因是,宏展开后变成:17+32>25+21?17+32:25+21,哇,这是什么啊?
所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。
  #define MAX( (a), (b) )   (a)>(b)?(a):(b)
  
即使是这样,也不这个宏也还是有Bug,因为如果我这样调用 MAX(i++, j++); ,经过这个宏以后,i和j都被累加了两次,这绝不是我们想要的。
  
所以,在宏的使用上还是要谨慎考虑,因为宏展开是的结果是很难让人预料的。而且虽然,宏的执行很快(因为没有函数调用的开销),但宏会让源代码澎涨,使目标文件尺寸变大,(如:一个50行的宏,程序中有1000个地方用到,宏展开后会很不得了),相反不能让程序执行得更快(因为执行文件变大,运行时系统换页频繁)。
因此,在决定是用函数,还是用宏时得要小心。

查看编译后产生的LST文件看看