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

C++ #define 與 typedef 區別深度解析

     編輯:關於C++

代碼實驗

#define SIGN1 char*
typedef char* SIGN2;

int main() {
    SIGN1 ch1, ch2;  // 展開為 char* ch1, ch2;
    SIGN2 ch3, ch4;  // 等價於 char* ch3, ch4;
    cout << sizeof(ch1) << " " << sizeof(ch2) << endl; // 4 1
    cout << sizeof(ch3) << " " << sizeof(ch4) << endl; // 4 4
}

核心區別

特性#definetypedef
處理階段預處理(文本替換)編譯(類型系統)
語義宏替換,無類型檢查類型別名,參與類型推導
指針聲明#define P int* → P a,b 僅 a 是指針typedef int* P → P a,b 皆為指針
作用域全局(文件級),無作用域限制遵循 C++ 作用域規則
調試調試器見不到宏名調試器可識別類型別名
複雜類型難以定義函數指針、模板別名完美支援 using/typedef

最佳實踐

  • 類型別名:永遠用 typedef 或 C++11 using(如 using P = int*;)。
  • 常量:用 const/constexpr 替代 #define。
  • 編譯條件:#ifdef 等僅預處理器能做,仍需宏。
  • 避免宏定義類型:極易導致聲明語義錯誤(如上例)。

總結

#define 是盲目文本替換,typedef 是編譯器層面的類型別名。指針聲明時兩者行為截然不同:#define P int* 導致 P a,b 中 b 是 int;而 typedef int* P 使 a,b 均為 int*。現代 C++ 應盡量用 using/typedef/constexpr 替代宏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved