三大錯誤報告介面
| 介面 | 頭文件 | 功能 |
errno | <errno.h> | 外部整數變數,保存最近一次庫函數錯誤碼(正整數,E* 宏) |
strerror(int) | <string.h> | 將錯誤碼轉為人類可讀字串,返回靜態緩衝區指標 |
perror(const char*) | <stdio.h> | 向標準錯誤輸出「前綴: 錯誤描述\n」,前綴為傳入字串 |
正確使用模式
- 呼叫庫函數前將
errno = 0 清零。
- 呼叫後檢查
errno 是否非零。
- 非零時依需求輸出:
perror 簡單直接,strerror 靈活嵌入自訂格式。
完整範例:數學定義域錯誤
#include
#include
#include
#include
int main(void) {
errno = 0;
double r = sqrt(-1.0); // 定義域錯誤,設置 errno = EDOM (33)
if (errno) {
printf("errno = %d\n", errno); // 33
perror("sqrt failed"); // sqrt failed: Numerical argument out of domain
printf("error: %s\n", strerror(errno)); // error: Numerical argument out of domain
}
return 0;
}
關鍵細節
errno 為執行緒局部儲存(現代實現),多執行緒安全。
strerror 返回的字串指標指向靜態緩衝區,後續呼叫會覆蓋,需立即複製若要保留。
perror(NULL) 或 perror("") 僅輸出錯誤描述,無前綴與冒號。
- 標準 C 僅保證
EDOM、ERANGE 兩宏,其他錯誤碼視實現定義。