【嵌入式必知】内联函数(inline)和宏定义(#defne)
一、 什么是内联函数
内联函数是 C/C++ 中的一种函数修饰符,通过在函数返回类型前加上inline关键字来指定。它的核心思想是“以空间换时间”:在编译阶段,编译器会尝试将内联函数的代码直接嵌入(展开)到每一个调用它的地方,从而省去了函数调用时的压栈、跳转和返回等开销,提高程序的执行效率。
inline int add(int a, int b) { return a + b; }二、什么是宏定义
宏定义是 C/C++ 中的预处理指令,通过#define来实现。它在编译前的预处理阶段执行,仅仅进行纯粹的文本替换,不涉及语法分析或类型检查。宏定义分为无参宏(常用于定义常量)和带参宏(形式上类似函数,用于替换表达式)。
#define ADD(a, b) ((a) + (b))三、内联函数和宏定义区别
对比项 | 内联函数(inline) | 宏定义(#define) |
|---|---|---|
处理阶段 | 编译阶段 | 预处理阶段 |
类型检查 | ✅ 有 | ❌ 无 |
参数求值 | 只求值一次 | 可能多次求值 |
调试 | ✅ 可调试 | ❌ 不可调试 |
副作用风险 | 低 | 高 |
作用域 | 遵循语言作用域 | 全局生效 |
是否生成函数符号 | 不一定 | 否 |
四、inline与static inline的区别
(1)inline
inline int add(int a, int b) { return a + b; }特点:
项目 | 说明 |
|---|---|
是否有函数本体 | ❌ 不强制 |
是否允许多次定义 | ✅ 允许(ODR-like) |
外部可见性 | ✅ 可能被外部引用 |
常见错误 | multiple definition(重复定义) |
(2)static inline
static inline int add(int a, int b) { return a + b; }特点:
项目 | 说明 |
|---|---|
是否有函数本体 | ✅ 每个翻译单元都有 |
是否允许多次定义 | ✅ 允许 |
外部可见性 | ❌ 仅当前文件可见 |
(3) 综合对比
特性 | inline | static inline |
|---|---|---|
链接属性 | 外部链接 | 内部链接 |
是否适合放头文件 | ❌ 不推荐 | ✅ 推荐 |
重复定义风险 | 高 | 无 |
代码膨胀风险 | 中 | 稍高 |
使用频率 | 少 | 极高 |
