首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Effective C++ 條款 02:以 const、enum、inline 取代 #define

     編輯:關於C++

為何棄用 #define?

#define 是前置處理器文字替換,無型別安全、無作用域、除錯困難(錯誤訊息顯示替換後的字面值而非宏名稱)。

常數定義:用 const / enum

// ❌ #define 缺點
#define MAX_SIZE 1024
// 錯誤訊息顯示 1024,難以追蹤;每次使用產生副本;無型別檢查

// ✅ const 常數
const int MaxSize = 1024; // 有型別、有作用域、單一記憶體位址、除錯顯示 MaxSize

// ✅ enum hack(舊編譯器不支援 static const 整數初始化時)
class GamePlayer {
    enum { NumTurns = 5 }; // 編譯期常數,不佔記憶體
    int scores[NumTurns];
};

類函數宏:用 inline 函數模板

// ❌ 危險宏:參數副作用、運算子優先級陷阱
#define MAX(a,b) ((a) > (b) ? (a) : (b))
int a = 5, b = 0;
MAX(++a, b);   // a 增加兩次!
MAX(++a, b+10); // a 增加一次!(b+10 > a)

// ✅ inline 函數模板:型別安全、無副作用、編譯器優化
template <typename T>
inline const T& max(const T& a, const T& b) {
    return a > b ? a : b;
}
  • inline 建議編譯器展開函數本體,避免呼叫開銷。
  • 參數以 const T& 傳遞,避免複製並保護原值。
  • 模板支援任意可比較型別。

總結原則

  1. 單純常數 → const(或 enum 用於類別內整數常數)。
  2. 類函數宏 → inline 函數模板。
  3. 盡量不要使用 #define 定義常數或函數式宏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved