() [] > 前綴 *。const/volatile 緊跟類型修飾類型,否則修飾左側指標。char * const *(*next)();
// next 是指標
// 指向函數
// 函數返回指標
// 該指標指向 char 類型的常量指標
為現有類型引入別名,不創建新類型。簡化複雜聲明,增強可讀性。
// 原始聲明
void (*signal(int sig, void (*func)(int)))(int);
// typedef 簡化
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
| 名字空間 | 包含 | 範例 |
|---|---|---|
| 標籤名 | goto 標籤 | label: |
| 標籤 | struct/union/enum 標籤 | struct Tag |
| 成員名 | 各結構/聯合獨立 | s.member |
| 普通識別符 | 變數、函數、typedef 名 | int x; typedef int T; |
不同空間可重名,同一空間內必須唯一。
typedef struct fruit { int weight; } fruit; // 同時定義標籤 fruit 和類型 fruit
struct fruit a; // 結構變數
fruit b; // typedef 類型變數
struct veg { int weight; } veg; // 標籤 veg + 變數 veg(非類型)
struct veg c; // OK
veg d; // 錯誤:veg 是變數非類型
#define peach int
unsigned peach x; // OK → unsigned int x;
typedef int peach;
unsigned peach y; // 錯誤:typedef 名不可再加修飾符
#define int_ptr int *
int_ptr a, b; // 展開 → int *a, b; a 是指標,b 是 int
typedef int *int_ptr;
int_ptr a, b; // 皆為 int*
enum sizes { small = 7, medium, large = 10, humungous };
// small=7, medium=8, large=10, humungous=11
優勢:調試器中符號可見,#define 符號編譯期丟失。
typedef 封裝函數指標、結構體等複雜類型。typedef 與宏:類型安全、聲明一致性、不可擴展。