預處理指令
- 在我們的文件編譯成0和1之前做得操作我們稱之為預處理指令
- 一般情況下,預處理指令都是以
#
號開頭 - 預處理指令分類
- 宏定義
- 條件編譯
- 文件包含
宏定義
-
不帶參數的宏定義
- 定義格式:
#define 宏名 值
- 注意:
宏定義后面不要寫分號
- 定義格式:
-
宏定義的作用
- 會在程序翻譯成0和1之前,將所有宏名替換為 宏的值
-
宏定義在什么時候替換:預處理階段
- 源代碼 -> 預處理 -> 匯編 -> 二進制 -> 可執行程序
// 定義宏
#define kCount 8
// 提前結束宏定義的作用域
#undef kCount
- 帶參數的宏定義
- 一般情況下建議寫帶參數的宏的時候,給每個參數加上一個()
- 一般情況下建議寫帶參數的宏的時候,給結果也加上一個()
/**
#define:代表要定義一個宏
kSum:宏的名稱
(v1, v2):參數,注意點:不要寫數據類型
v1 + v2 :用于替換的內容
*/
#define kSum(v1, v2) v1 + v2
#define kMut(v1, v2) ((v1) * (v2))
宏定義并不會做任何運算,無論是有參數還是沒有參數都僅僅是在翻譯成0和1之前做一個簡單的"替換"
條件編譯
- 一般情況下,條件編譯是和宏定義結合在一起使用
#if kCount == 8
#elif kCount == 9
#else
#endif
#ifdef kCount // 判斷是否定義了名稱叫做kCount的宏
#elif kMut
#else
#endif
#ifndef kCount // 判斷是不是沒有定義名稱叫做kCount的宏
#else
#endif
-
條件編譯和選擇結構if的共同點
- 都可以對給定的條件進行判斷,添加滿足或者不滿足都可以執行特定的代碼
-
條件編譯和選擇結構if的區別
- 生命周期不同
- if 運行時
- #if 編譯之前
- #if需要一個明確的結束符號,#endif
- if會將所有的代碼都編譯到二進制中,#if只會將滿足條件的部分編譯到二進制中
- 生命周期不同