宏定义
宏替换是按定义替换成相应的常量表达式或字符闯,不会增加任何其他字符(如圆括号()等)
#define NUM 5+7
p = NUM*NUM将会被替换成p = 5+7*5+7
所以宏定义仅仅是文本替换。
宏定义与内联函数
首先,为什么需要使用宏定义?
函数调用需要使用函数栈,需要一定的时间和空间的开销,影响其效率。
宏定义在预编译的地方将代码展开,不需要额外的时间和空间开销。
宏的缺点?
1、不能访问对象的私有成员
2、很容易产生二义性。
3、无法单步调试
4、没有类型检查
内联函数
编译期间,将内联函数的代码插入调用者代码处的函数,避免被调用的开销来提高执行效率。也就是说
内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样展开,所以取消了函数的参数压栈,减少了调用的开销。
内联函数的局限
如果内联函数中执行的代码太多,一般编译器会放弃内联的方式,而采用普通的方式,这样就和普通的函数执行效率相同了。
wiki上还有其他一些问题
- 宏调用并不执行类型检查,甚至连正常参数也不检查,但是函数调用却要检查。
- C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和操作顺序。
- 在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。
- 许多结构体使用宏或者使用不同的语法来表达很难理解。内联函数使用与普通函数相同的语言,可以随意的内联和不内联。
- 内联代码的调试信息通常比扩展的宏代码更有用。