errno
宏 <cerrno>
int
最终错误码
这个宏扩展为int类型的可修改左值。因此,程序既可以读取它,也可以修改它。
errno在程序启动时设置为零,标准C库中的任何函数都可以将其值修改为不同于零的值,
通常是为了提示特定类型的错误(没有库函数在更改后将其值设置为零)。
程序也可以修改它的值。事实上,如果这个变量用于库函数调用后的错误检查,那么在调用之前,
程序应该将它重置为零(因为之前对库函数的任何调用都可能改变了它的值)。
声明errno (<cerrno>)的头文件至少还声明了以下宏常量,它们的值不等于0:
宏 |
当errno设置为该值时 |
EDOM |
域错误 : 一些数学函数只被定义为特定的实值,这被称为它的域,
例如,sqrt函数只被定义为非负数,因此,
如果用一个负参数调用sqrt函数,
则将errno设置为EDOM。
|
ERANGE |
范围错误 : 变量可以表示的值的范围是有限的。例如,
像pow这样的数学函数很容易地超出浮点变量所表示的范围,
或者像strtod这样的函数可以遇到比范围所表示的值更长的数字序列。
在这些情况下,errno被设置为ERANGE。
|
EILSEQ |
非法序列 : 多字节字符序列可能有一组受限制的有效序列。
当一组多字节字符被mbrtowc等函数编译时,当遇到无效序列时,
errno被设置为EILSEQ。
|
标准库的函数可以将errno设置为任意值(不仅仅是上面列出的可移植值)。
特定的标准库实现可以在这个头文件中定义额外的名称。
c++ 11扩展了这个头文件中需要定义的基本值集,包括了POSIX环境中也可用的许多名称,
将可移植errno值的总数增加到78。有关完整列表,请参见errc。
与errno值关联的特定错误消息可以使用
strerror获取,
也可以直接使用
perror函数打印。
在c++中,errno总是声明为宏,但在C中,它也可以实现为具有外部链接的int对象。
🍄 数据竞争
支持多线程的库应该在每个线程的基础上实现errno:每个线程都有自己的本地errno。
这符合C11和c++ 11标准的库的要求。