C/Objective-C 預處理指令,編譯前進行文本替換,提升代碼可讀性與靈活性。
#define NAME "abc"
int main() {
NSString *str = [[NSString alloc] initWithCString:NAME];
NSLog(@"%@", str); // 輸出 abc
}
#define 常量名 常量值,以空格分隔,行尾無分號。#import 之後。
#define A 2
#define B A*2 // 可引用其他 #define
// B 展開為 2*2
#define FUNC(x,y) ((x) * (y))
#define MYFUN(x) (x * 5)
int main() {
int v = FUNC(5, 5); // 25
int x = MYFUN(5); // 25
}
(x) 防止運算符優先級問題。((x)*(y)) 保護上下文。MYFUN(i++))。| 特性 | #define | typedef |
|---|---|---|
| 類型檢查 | 無(文本替換) | 有(編譯器處理) |
| 作用域 | 文件級(無作用域) | 遵循塊作用域 |
| 條件編譯 | 支援 #ifdef/#ifndef/#undef | 不支援 |
| 指標聲明一致性 | 失效(見上文陷阱 3) | 保證一致 |
| 調試可見性 | 符號丟失 | 符號保留 |