ISO C 標準規定編譯器必須提供五個核心預定義宏,它們以雙下劃線開頭結尾,為編譯時信息獲取與調試追蹤提供標準化支持。本文詳細解析每個宏的用法與實戰場景。
| 宏名稱 | 類型 | 含義 | 示例輸出 |
|---|---|---|---|
__DATE__ | 字符串字面值 | 編譯日期,格式 "Mmm dd yyyy" | "Mar 19 2006" |
__FILE__ | 字符串字面值 | 當前源文件名稱 | "main.c" |
__LINE__ | 整數常量 | 當前行號(從文件開頭計算) | 42 |
__TIME__ | 字符串字面值 | 編譯時間,格式 "hh:mm:ss" | "08:00:59" |
__STDC__ | 整數常量 | 是否遵循 ISO C 標準(1=是) | 1 |
__FILE__ 與 __LINE__ 組合是經典調試技巧:
#define DEBUG_LOG(fmt, ...) \
printf("[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)
// 使用示例
DEBUG_LOG("Variable x = %d", x);
// 輸出:[main.c:42] Variable x = 10
const char* build_time = __DATE__ " " __TIME__;ASSERT(expr) 宏包含文件行號__func__ (C99) 記錄函數名#if __STDC__ 區分標準/非標準模式__LINE__ 會隨代碼插入刪除變化,重構需謹慎__FUNCTION__、__PRETTY_FUNCTION__)非標準現代標準增加:__STDC_VERSION__(標準版本號)、__STDC_HOSTED__(宿主環境)、__cplusplus(C++ 編譯器標識)等。