預處理器在編譯前掃描源碼,處理以 # 開頭的指令:文件包含、宏定義/展開、條件編譯、刪除註釋/多餘空白。輸出經轉換的源碼供編譯器使用。
| 指令 | 用途 |
|---|---|
# | 空指令,無效果 |
#include | 包含源文件 |
#define | 定義宏 |
#undef | 取消宏定義 |
#if | 條件編譯 (表達式真) |
#ifdef | 宏已定義則編譯 |
#ifndef | 宏未定義則編譯 |
#elif | 前條件假、當前真則編譯 |
#else | 前條件假則編譯此分支 |
#endif | 結束條件編譯塊 |
#error | 停止編譯並報錯 |
#line | 改變錯誤報告行號/文件名 |
#pragma | 編譯器特定指令 (如禁用警告) |
#include <file.h>:搜索編譯器標準庫路徑#include "file.h":先搜索當前源文件目錄,再搜索標準路徑#ifndef MY_HEADER_H
#define MY_HEADER_H
// ... 內容 ...
#endif
#define MAX_NUM 10
#define VERSION "V1.0.0"
#define THREE (ONE + TWO) // 可引用前序宏,建議加括號
用途:賦予常量語義、集中維護、避免魔術數字。
#define CUBE(x) ((x) * (x) * (x))
#define PASTE(prefix, n) prefix##n // ## 連接符
CUBE(i++) 展開為 ((i++) * (i++) * (i++)) → i 增加 3 次!嚴禁傳遞有副作用的表達式#define STR(x) #x → STR(abc) 展開為 "abc"#define CONCAT(a,b) a##b → CONCAT(var, 1) → var1#define DEBUG 1
#if DEBUG
printf("Debug mode\n");
#elif defined(RELEASE)
printf("Release mode\n");
#else
printf("Unknown\n");
#endif
#if DEBUG ... #endif,發布時定義 DEBUG=0#ifdef __C51__ ... #elif defined(__ARM__) ... #endif#ifndef GUARD ... #define GUARD ... #endif| 指令 | 說明 |
|---|---|
#pragma SAVE / #pragma RESTORE | 保存/恢復編譯選項狀態 |
#pragma WARNING DISABLE n | 禁用特定警告編號 |
#pragma OBJECT "name" | 指定目標文件名 |
#pragma ASM / #pragma ENDASM | 內嵌匯編代碼塊 |
#pragma NOAREGS | 禁用寄存器組優化 (用於中斷服務程序) |
#pragma INTERRUPT func | 聲明中斷函數 (自動保存/恢復上下文) |
i++、函數調用等有副作用表達式const/enum 替代對象宏**:類型安全、可調試、作用域受控#pragma 控制編譯器行為** (中斷、優化、警告)