属性 |
#define宏定义 | 函数 |
代码长度 |
每次使用时,宏代码都会被插入到程序中。除了非常小的宏之外,程序的长度会大幅度的增长。 | 函数代码只出现于一个地方;每次使用这个函数时,都调用那个地方的同一份代码。 |
执行速度 |
不需要调用额外的内存开销,代码在预编译过程中就完成替换,速度更快。 | 存在函数的调用和返回的额外开销,相对慢一些。 |
操作符优先级 |
宏参数的求值是在所有周围表达式的上下文环境里,除非加上括号,否则邻近操作符的优先级可能会产生不可预料的后果,所有建议在书写宏是多一些括号。 | 函数参数只在函数调用的时候求值一次,它的结果值传递给函数。表达式的求值结果更容易预测。 |
带有副作用的参数 | 参数可能被替换到宏体中的多个位置,所以带有副作用的参数求值可能会产生不可预料的结果 | 函数参数只在传参的时候求值一次,结果更容易控制。 |
参数类型 | 宏的参数与类型无关,只要对参数的操作是合法的,它就可以使用于任何操作类型。 | 函数的参数是与类型有关的,如果参数的类型不同,就需要不同的函数,即使他们执行的任务是相同的。 |
调试 | 宏是不方便调试的 | 函数是可以逐语句调试的 |
递归 | 宏是不能递归的 | 函数是可以递归的 |
传参 | 宏的参数可以是类型 | 函数参数不能是类型 |