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

C++ 基礎進階:typedef 四大核心用法與複雜宣告讀寫技巧

     編輯:C++ 入門

typedef 不只是巨集替換,而是**型別別名機制**,參與型別系統,比巨集更安全、語義更清晰。本文詳解四大用法與「右左法則」讀寫複雜宣告。

用法一:簡化指標/複雜型別多變數宣告


char* pa, pb;   // 陷阱:pa 為 char*,pb 為 char
// 改用 typedef:
typedef char* PCHAR;
PCHAR pa, pb;   // 正確:兩者皆為 char*

// 雖 char *pa, *pb 也可,但 typedef 更直觀,大量指標處更省事

用法二:兼容舊式 C 結構體寫法

舊 C 需 struct Tag 名:


struct tagPOINT1 { int x; int y; };
struct tagPOINT1 p1;  // 必須帶 struct

C++ 可直接 tagPOINT1 p1。為省去 struct 關鍵字,舊碼常見:


typedef struct tagPOINT { int x; int y; } POINT;
POINT p1;  // 等同 tagPOINT p1,少寫 struct

現代 C++ 直接用 struct POINT { ... }; 即可,但理解此模式利於維護遺留代碼。

用法三:定義平台無關型別(可移植性核心技巧)


// 平台一:支援 long double
typedef long double REAL;

// 平台二:不支援 long double
typedef double REAL;

// 平台三:僅支援 float
typedef float REAL;

跨平台時**只改 typedef 定義**,業務代碼零修改。標準庫廣泛採用(如 size_t、ptrdiff_t、int32_t)。

用法四:為複雜宣告建立可讀別名

方法:**逐步替換**,變數名部分最後替換。

  1. int *(*a[5])(int, char*)
    變數名 a → 別名 pFun
    typedef int (*pFun)(int, char*);
    簡化版:pFun a[5];
  2. void (*b[10])(void (*)())
    右側參數 → 別名一 pFunParam:typedef void (*pFunParam)();
    左側變數 b → 別名二 pFunx:typedef void (*pFunx)(pFunParam);
    簡化版:pFunx b[10];
  3. double (*(*e)[9])()
    左側 → 別名一 pFuny:typedef double (*pFuny)();
    右側變數 e → 別名二 pFunParamy:typedef pFuny (*pFunParamy)[9];
    簡化版:pFunParamy e;

複雜宣告讀寫神技:右左法則

  1. 從**變數名**開始。
  2. **先往右**,遇 []/() 說明陣列/函數。
  3. **再往左**,遇 */& 說明指標/引用。
  4. 遇圓括號**反向**,括號內分析完跳出,繼續先右後左。

示例:


// int (*func)(int *p)
func → 右 ) → 反向左 * → 指標
跳出 → 右 (int *p) → 函數,參數 int*
左 int → 回傳 int
結論:func 為指向「參數 int*、回傳 int 函數」的指標

// int (*func[5])(int *)
func → 右 [5] → 5 元素陣列
左 * → 元素為指標
跳出 → 右 (int *) → 指向「參數 int*、回傳 int 函數」的指標
結論:func 為函數指標陣列

掌握 typedef 四大用法與右左法則,輕鬆駕馭 C++ 型別系統,寫出清晰、可移植、可維護的代碼。

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