<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 标准的库的要求。