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

C 語言 typedef 完全指南:別名定義、指針、結構體、函數指針與宏對比

     編輯:關於C

基本語法

typedef 原類型 新類型名;
// 例
typedef int Integer;
Integer a = 8;  // 等價於 int a = 8;

一、基本類型別名

  • 可鏈式:typedef Integer MyInt;
  • 原類型名仍可用
  • 提升可讀性:typedef uint32_t u32; 統一項目類型風格

二、指針類型別名

typedef char *String;
String s = "hello";  // char *s
String s1, s2;       // char *s1, *s2  —— 注意:每個變量都是指針

陷阱對比:#define String char * 時,String s1, s2 展開為 char *s1, s2 → s2 是 char 而非指針!typedef 是類型系統一部分,宏只是文本替換。

三、結構體別名(免寫 struct 關鍵字)

/* 方式 1:先定義再別名 */
struct Person { char *name; int age; };
typedef struct Person Person_t;
Person_t p = {"Alice", 20};

/* 方式 2:定義時同時別名,結構體標籤可省略 */
typedef struct {
    int age;
} Student;
Student stu = {18};

/* 方式 3:結構體指針別名(鏈表常用) */
typedef struct Node {
    int data;
    struct Node *next;
} Node, *NodePtr;  // Node 是結構體類型,NodePtr 是指針類型

Node n1 = {1, NULL}, n2 = {2, NULL};
n1.next = &n2;
NodePtr p = &n2;  // 等價於 struct Node *p

四、枚舉類型別名

typedef enum { SPRING, SUMMER, AUTUMN, WINTER } Season;
Season s = SUMMER;

五、函數指針別名 —— 簡化複雜聲明

int add(int a, int b) { return a + b; }

/* 無 typedef:int (*p)(int, int) = add; */
typedef int (*BinaryOp)(int, int);
BinaryOp op = add;
int result = op(3, 5);  // 8

回調函數、狀態機、插件架構中極大提升可讀性。

六、typedef vs #define 核心差異總結

特性typedef#define
處理階段編譯期(語義分析)預處理期(文本替換)
作用域遵循 C 作用域規則無作用域,文件級生效
指針聲明每個變量都是指針僅首個變量是指針
組合類型支持(函數指針、數組等)極易出錯
調試符號保留類型信息無類型信息

七、工程規範建議

  1. 項目統一類型命名:typedef int32_t i32; typedef uint32_t u32;
  2. 結構體定義即別名:typedef struct { ... } TypeName;
  3. 指針類型單獨別名:typedef Type *TypePtr; 便於識別
  4. 公共頭文件集中類型定義,避免重複定義衝突

總結

typedef 是 C 語言類型系統的擴展機制,比宏更安全、更語義化、更利於維護。掌握「基本類型、指針、結構體、函數指針」四大典型用法,並牢記「指針聲明陷阱」,能寫出更清晰、可移植的 C 代碼。

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