内联函数与宏定义的本质区别
C++中inline关键字和预处理器宏(#define)有什么区别?内联函数为什么是类型安全的?为什么说内联只是对编译器的"建议"而非强制?现代编译器如何处理inline?
回答
Yahuda
宏:预处理器阶段纯文本替换,无类型检查、无作用域、无参数求值顺序保证。隐患:#define SQUARE(x) x*x中SQUARE(a+b)展开为a+b*a+b。内联函数:真正函数,编译期处理,类型检查、作用域规则、参数只求值一次。inline关键字对编译器是建议而非命令——编译器可能忽略内联(如递归、过长函数),也可能自动内联未标记的函数。现代编译器行为:编译器基于成本和收益自行决定是否内联(通常在LTO(链接时优化)阶段跨编译单元内联)。inline在C++17后还用于定义内联变量(保证多编译单元定义不冲突)。区别总结:宏可生成代码片段(如assert);内联函数更安全可靠。C++20的consteval和constexpr进一步替代部分宏场景。建议:用constexpr/内联函数替代95%的宏。