#define Pi 3.1415926
#define S(r) PI*r*r
(1)函数调用时,先求出实参表达式的值,然后代入形参,而使用带参数的宏只是进行简单的字符替换。例如S(a+b),在宏展开时并不求a+b的值,而只将实参字符“a+b替换形参r”
(2)函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。
(3)对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何类型的数据。
(4)函数调用只可得到一个返回值,而宏可以设法得到多个结果。
#define PI 3.1415926
#define CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*R
(5)使用宏次数多时,宏展开后源程序变长,因为每展开一次都使得程序增长,而函数调用不会使源程序变长。
(6)宏替换不占运行时间,只占编译时间。而函数调用则占用运行时间(分配单元、保留现场、值传递、返回)