C語言標准庫中的錯誤報告用法有三種形式。
1、errno
errno在
#ifndef errno extern int errno; #endif
外部變量errno保存庫程序中實現定義的錯誤碼,通常被定義為errno.h中以E開頭的宏,
所有錯誤碼都是正整數,如下例子
# define EDOM 33 /* Math argument out of domain of function. */
EDOM的意思是參數不在數學函數能接受的域中,稍後的例子中用到了這個宏。
errno的常見用法是在調用庫函數之前先清零,隨後再進行檢查。
2、strerror
strerror在
__BEGIN_NAMESPACE_STD /* Return a string describing the meaning of the `errno' code in ERRNUM. */ extern char *strerror (int __errnum) __THROW; __END_NAMESPACE_STD
函數strerror返回一個錯誤消息字符串的指針,其內容是由實現定義的,字符串不能修改,但可以在後續調用strerror函數是覆蓋。
3、perror
perror在
__BEGIN_NAMESPACE_STD /* Print a message describing the meaning of the value of errno. This function is a possible cancellation point and therefore not marked with __THROW. */ extern void perror (const char *__s); __END_NAMESPACE_STD
函數perror在標准錯誤輸出流中打印下面的序列:參數字符串s、冒號、空格、包含errno中當前錯誤碼的錯誤短消息和換行符。在標准C語言中,如果s是NULL指針或NULL字符的指針,則只打印錯誤短消息,而不打印前面的參數字符串s、冒號及空格。
下面是幾個簡單的例子
#include#include #include #include int main(void) { errno = 0; int s = sqrt(-1); if (errno) { printf("errno = %d\n", errno); // 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; }