效率:带参宏比函数效率高,因为,宏是编译之后把代码嵌进去了,而函数调用需要很多的步骤(比如保存现场,恢复现场等操作),但是宏生存的文件体积大,因为,替换一次宏就需要生存一个相应的代码段,而函数不会,函数只会有1次代码量。
问题:有参数宏,最大的一个问题就是它对参数的多次求值,而函数只对参数求值一次。
比如#define isdigit(c) ('0' <= (c) && (c) <= '9')
如果我这样调用isdigit(c=getchar()), 看看问题出来了吧。
所以,C标准中规定库函数可以用宏实现,但是必须保证只求值一次。其实C库中好的函数都是宏,像getchar, isxxx.