1、#define只是简单的替换,不会进行参数的检查,容易出现错误,当然这是众所周知的;
2、#define不属于语言的一部分,在预编译过程中预编译器会将所有的宏替换掉,例如#define MAX_LEN 100 预编译器处理后,所有使用MAX_LEN的地方都被换成了100,也就是说编译器并没有看见MAX_LEN,MAX_LEN也并没有进入记号表symbol table中,当程序中运用MAX_LEN出现一个编译错误时,错误的提示就会是100,这个时候你就会有点摸不着头脑了,100是什么鬼。。。于是你会浪费很多时间去追踪它;
顺便提一句内联函数,内联函数定义应该尽可能的简短,简单,不应该出现循环体或者switch语句,因为实际上内联函数也有点类似于宏替换,凡是调用到该函数的地方都被直接用该函数体替换了,所有内联函数的执行步数应该是清晰可见并且可确定的,但实际上,即使你声明了一个内联函数如果定义并不满足内联函数的规则那么编译器也并不会将它当做内联函数看待,如果你声明了一个普通函数但满足内联函数的规则,编译器会自动将其内联,所以用inline声明一个内联函数对现在的编译器来讲已经没有多大的意义。