概述
在 Robert C.Searcord 的 The Cert C Secure Coding Standard 一书中,关于宏定义的规范中第一条就是
用内联函数或静态函数替代与函数相似的宏
这个规范非常实用。内联函数是C99标准中新增的,当宏定义和内联函数可以互换时,应该优先考虑选择内联函数,这也是为什么在C++标准库函数中 max, min, swap 等都是通过内联函数来实现的原因。 宏定义是完全原封不动的很SB的替换,而内联函数则并非简单的文本替换,而是按函数调用的方式展开。关于内联函数相对于宏替换的优点,在wiki有如下几点的总结:
- 宏调用并不执行类型检查,甚至连正常参数也不检查,但是函数调用却要检查。
- C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和操作顺序。
- 在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。
- 许多结构体使用宏或者使用不同的语法来表达很难理解。内联函数使用与普通函数相同的语言,可以随意的内联和不内联。
- 内联代码的调试信息通常比扩展的宏代码更有用。
其中前面两条很好理解,相信大家应该不陌生,这里主要通过具体讨论一个该书中提到的一个程序实例来感受一下后面几点。




