1. 宏定义是由预处理器处理的,而内联函数则由编译器控制
2. 宏不能访问类的私有成员,内联函数可以
3. 宏只是简单的字符串替换,容易产生二义性,如#define F1(x) (x)*(x),尽管都加了括号,但如果调用F1(i++),那么i就加了两次,而不是我们希望的一次
4. 内联函数会对参数进行合法性检查
5. 内联函数是可以调试的
6. 当然内联函数也是有缺陷的,如果函数行数太多或包含循环这样复杂的语句,编译器就把它作为普通函数来处理了,也就失去了它高效的特性;而宏没有这个问题
另外防止文件的重复包含也只能用宏来实现