inline int min(int a, int b) { return a < b ? a : b; }
// 編譯器可能將調用點直接替換為函數體,省去壓棧/跳轉/返回開銷
inline **必須與函數定義放在一起** (通常在頭文件),否則編譯器忽略請求。__attribute__((always_inline)) 可強制 (GCC/Clang)。constexpr 隱含內聯語義,且保證編譯期可計算。| 特性 | 內聯函數 | 宏 (#define) |
|---|---|---|
| 類型檢查 | 是 | 無 (文本替換) |
| 副作用 | 無 (參數求值一次) | 有 (如 MIN(++a,b) 導致 a 增兩次) |
| 調試 | 可設置斷點、查看變量 | 不可調試 |
| 作用域 | 遵循 C++ 作用域規則 | 全局文本替換 |
結論:完全替代宏定義函數片段,拒絕 #define 實現邏輯。
void connect(string host, int port = 80, int timeout = 3000);
// 調用: connect("localhost"); connect("api.com", 443); connect("svc", 8080, 5000);
void callback(int /*event*/, void* /*data*/) { /* 當前不需要參數,但介面預留 */ }
// 或
void func(int, double = 3.14); // 僅聲明類型,無參數名
f(int, double) vs f(double, int))返回類型、cv 資格、異常規範不能作為重載依據。
T→T&, T→const T&, 數組/函數退化、bool 提升、整數提升)。... 匹配。**二義性** → 編譯錯誤;**無可行函數** → 編譯錯誤。
int f(int); int f(double);
int (*p1)(int) = f; // 精確匹配 f(int)
int (*p2)(double) = f; // 精確匹配 f(double)
// int (*p3)(...) = f; // 錯誤:二義性
賦值時按指針類型從重載集選擇匹配者。
inline (或 constexpr),複雜邏輯交給編譯器優化器。print(int)/print(string)),語義不同請用不同名。f(int)/f(double) 調用 f(3.14f) 選 double 版),必要時用 explicit 構造或刪除不想要的重載 (=delete)。