預處理階段
編譯前處理 # 開頭指令:宏定義、文件包含、條件編譯。輸出純 C 代碼供編譯器使用。
一、宏定義
1. 無參宏
#define PI 3.1415926
// 預處理將所有 PI 替換為 3.1415926
// 注意:行尾無分號,否則連分號一起替換導致語法錯誤
2. 帶參宏
#define S(r) PI*(r)*(r)
// 調用 S(a+1) → PI*(a+1)*(a+1)
// 宏名與括號間**不可有空格**,否則變為無參宏
#define S (r) PI*(r)*(r) // 錯誤!展開為 PI*(r)*(r)(a+1)
參數替換規則:形參被實參文本替換,非參數字符保留。
3. 宏 vs 函數
| 特性 | 宏 | 函數 |
| 類型檢查 | 無 | 有 |
| 開銷 | 無調用開銷 | 有調用開銷 |
| 代碼膨脹 | 多次展開增大體積 | 單一實體 |
| 調試 | 難(無符號) | 易 |
| 副作用 | 參數多次求值風險 | 單次求值 |
二、文件包含
#include // 系統頭文件(標準路徑搜尋)
#include "filename" // 用戶文件(當前目錄優先搜尋)
將指定文件內容完整插入當前位置。防止重複包含慣用 #ifndef GUARD_H #define GUARD_H ... #endif。
三、條件編譯
1. #ifdef / #ifndef / #else / #endif
#ifdef COMPUTER_A
#define INT_SIZE 16
#else
#define INT_SIZE 32
#endif
2. #if / #elif / #else / #endif
#if VERSION >= 2
#define FEATURE_X
#elif VERSION == 1
#define FEATURE_Y
#else
#define FEATURE_Z
#endif
常見用途
- 跨平台適配(不同架構類型大小)。
- 調試開關(
#ifdef DEBUG)。
- 防止頭文件重複包含。
- 代碼版本裁剪。
總結
預處理器提供強大的文本操作能力,善用可提高可移植性與靈活性。核心原則:宏用於常量/簡單展開,複雜邏輯用函數;條件編譯隔離平台差異;文件包含管理模組依賴。
- 上一篇文章: C語言 const 與 volatile 關鍵字深度解析
- 下一篇文章: C語言動態內存管理核心:malloc/free 與指標的協作機制
Copyright ©
程式碼之家 All Rights Reserved