函數調用涉及棧幀建立、參數傳遞、跳轉返回 —— 對微小高頻函數開銷明顯。inline 關鍵字請求編譯器**將函數體內聯展開至調用點**,消除開銷,兼顧可讀性與性能。
switch (C99/C++ 限制放寬,但複雜控制流不宜內聯)inline 出現在定義處即可,聲明處可省略// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
inline int is_digit(char ch) { // 定義即內聯
return (ch >= '0' && ch <= '9');
}
inline int square(int x) { return x * x; }
#endif
// main.c
#include
#include "math_utils.h"
int main() {
char c;
while ((c = getchar()) != '\n') {
if (is_digit(c))
puts("Digit");
else
puts("Non-digit");
}
printf("Square of 5: %d\n", square(5));
return 0;
}
inline 只是**建議**,編譯器可拒絕 (函數過大、虛函數、函數指針取址等)inline 關鍵字static inline (C99) / 無名命名空間 (C++) 避免多重定義鏈接錯誤| 特性 | 宏 #define | 內聯函數 inline |
|---|---|---|
| 類型安全 | ❌ 無 | ✅ 完整類型檢查 |
| 副作用 | 參數多次求值風險 | ✅ 單次求值 |
| 調試 | 不可單步進入 | ✅ 可調試 (部分編譯器) |
| 作用域 | 無 (預處理器) | ✅ 遵循語言作用域 |
| 遞歸 | ❌ | ❌ (C++ 允許但不展開) |
結論: 能用 inline 絕不用宏 (除非字符串化/拼接等預處理特有功能)。