网上搜到的一些回复:
很多程序员不知道
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,
Woh,这是什么啊?
所以,宏在使用时,参数一定要加上括号,上述的那个例子改成如下所示就能解决问题了。
#define MAX( (a), (b) ) (a)>(b)?(a)b)
即使是这样,也
不这个宏也还是有
Bug,因为如果我这样调用
MAX(i++,j++); , 经过这个宏以后,
i和
j都被累加了两次,这绝不是我们想要的。所以,在宏的使用上还是要谨慎考虑,因为
宏展开是的结果是很难让人预料的。而且虽然,宏的执行很快(因为没有函数调用的开销),
但宏会让源代码
澎涨,使目标文件尺寸变大,(如:一个
50行的宏,程序中有
1000个地方用到,
宏展开后会很不得了),相反不能让程序执行得更快(因为执行文件变大,运行时系统换页频繁)。
因此,在决定是用函数,还是用宏时得要小心。
1.
宏定义比较直观,简洁,易懂,用起来也方便,而且大家都已经习惯用
宏了。。。还有就是一些如条件编译等只能用
宏来做。
2.(__BORLANDC__)像这种的应该是编译器或者操作系统里包含有该信息,如_WIN32。如果不是的话,那么应在使用处#define 该
宏,如果使用到的
宏定义很多的话,可以在外面另写一个def.h文件,将各种可能的#define 包含进去。
个人见解。。。
宏是杀手,^_^..
比如:#define private public