預處理指令在編譯前對源碼進行文本級處理。除常見的 #define、#include、條件編譯外,#error、#line、#undef 是進階開發中強大的工具,分別用於編譯期斷言、行號/文件名控制、宏取消定義。
#error — 編譯期強制報錯#error token-string
token-string 為任意字符序列,將作為錯誤信息輸出。#if !defined(__cplusplus) #error C++ compiler required. #endif
#line — 控制編譯器行號與文件名#line digit-sequence ["filename"]
digit-sequence:任意整數常量,設置 __LINE__ 預定義宏。filename:可選,雙引號包圍,設置 __FILE__ 預定義宏。__LINE__、__FILE__ 輸出精確錯誤位置。// 設置當前行號為 151,文件名為 copy.c #line 151 "copy.c" // 自定義斷言宏 #define ASSERT(cond) if(!(cond)) \ {printf("assertion error line %d, file(%s)\n", __LINE__, __FILE__);}
#undef — 取消宏定義#undef identifier
identifier 的當前宏定義,後續出現將被預處理器忽略。#define/#undef 限制宏作用域,避免污染全局命名空間。#if 實現精細的編譯開關。/U macro-name 相當於文件開頭的 #undef。#define WIDTH 80 #define ADD(X, Y) ((X) + (Y)) ... 使用宏 ... #undef WIDTH #undef ADD // 此處後 WIDTH、ADD 已不可用
| 指令 | 核心作用 | 典型應用 |
|---|---|---|
#error | 編譯期終止並報錯 | 環境檢查、配置衝突檢測 |
#line | 重置 __LINE__/__FILE__ | 代碼生成工具、自定義斷言 |
#undef | 撤銷宏定義 | 宏作用域隔離、條件編譯、避免命名衝突 |
善用這三條指令,能顯著提升代碼的健壯性、可維護性與診斷能力。