一 宏
預處理器是一個文本替換工具
宏就是文本替換
//宏一般使用大寫區分
//宏變量
//在代碼中使用 A 就會被替換爲1
#define A 1
//宏函數
#defind test(i) i > 10 ? 1: 0
//其他技巧
// # 連接符 連接兩個符號組成新符號
#define DN_INT(arg) int dn_ ## arg
DN_INT(i) = 10;
dn_i = 100;
// \ 換行符
#define PRINT_I(arg) if(arg) { \
printf("%d\n",arg); \
}
PRINT_I(dn_i);
//可變宏
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,"NDK", __VA_ARGS__);
//陷阱
#define MULTI(x,y) x*y
//獲得 4
printf("%d\n", MULTI(2, 2));
//獲得 1+1*2 = 3
printf("%d\n", MULTI(1+1, 2));
二 宏函數
優點:
文本替換,每個使用到的地方都會替換爲宏定義。
不會造成函數調用的開銷(開闢棧空間,記錄返回地址,將形參壓棧,從函數返回還要釋放堆
棧。)
缺點:
生成的目標文件大,不會執行代碼檢查
三 內聯函數
和宏函數工作模式相似,但是兩個不同的概念,首先是函數,那麼就會有類型檢查同時也可以debug
在編譯時候將內聯函數插入。不能包含複雜的控制語句,while、switch,並且內聯函數本身不能直接調用自身。
如果內聯函數的函數體過大,編譯器會自動的把這個內聯函數變成普通函數。
拓展:手寫sprintf
根據可變參數、指針運算等知識自己實現 sprintf 函數(只實現 %d 就行)!