<cerrno>

errno

int
上一個錯誤號
這個宏展開為一個型別為 int 的可修改的左值。因此,程式既可以讀取它,也可以修改它。

errno 在程式啟動時被設定為零,任何 C 標準庫函式都可以將其值修改為某個非零值,通常用於表示特定類別的錯誤(一旦值被更改,沒有庫函式會將其設定回零)。

程式也可以修改它的值。實際上,如果打算在庫函式呼叫後使用此變數進行錯誤檢查,程式應在呼叫前將其重置為零(因為任何先前的庫函式呼叫都可能已經改變了它的值)。

宣告 errno 的同一個標頭檔案(<cerrno>)也至少聲明瞭以下值為非零的宏常量:

含義,當errno被設定為此值時
EDOM定義域錯誤(Domain error):某些數學函式僅對特定的實數值有定義,這被稱為其定義域。例如,平方根函式僅對非負數有定義,因此如果使用負數引數呼叫 sqrt 函式,它會設定errnoEDOM
ERANGE值域錯誤(Range error):一個變數能夠表示的值的範圍是有限的。例如,像 pow 這樣的數學函式很容易超出浮點變數可表示的範圍,或者像 strtod 這樣的函式可能遇到比可表示值範圍更長的數字序列。在這些情況下,errno被設定為ERANGE.
EILSEQ非法序列(Illegal sequence):多位元組字元序列可能有一套受限的有效序列。當像 mbrtowc 這樣的函式翻譯一組多位元組字元時,如果遇到無效序列,errno 會被設定為 EILSEQ

標準庫的函式可以將 errno 設定為任何值(不僅限於上面列出的可移植值)。特定的庫實現可能會在此標頭檔案中定義額外的名稱。

C++11 擴充套件了此標頭檔案中需要定義的基本值集合,包含了許多在 POSIX 環境中也可用的名稱,將可移植的 errno 值的總數增加到 78 個。有關完整列表,請參閱 errc

errno值相關聯的具體錯誤訊息可以使用 strerror 獲取,或使用 perror 函式直接列印。

在 C++ 中,errno 總是被宣告為宏,但在 C 中,它也可能被實現為一個具有外部連結的 int 物件。

資料競爭

支援多執行緒的庫應在每個執行緒的基礎上實現 errno:即每個執行緒都有其自己的本地 errno
這是符合 C11 和 C++11 標準的庫的要求。