C++官网参考链接:https://cplusplus.com/reference/cerrno/errno/
宏
errno
int
最后的错误编号
这个宏展开为int类型的可修改左值。因此,它可以被程序读取和修改。
errno在程序启动时被设置为0,标准C库的任何函数都可以将其值修改为不同于0的某个值,通常用来表示特定的错误类别(没有任何库函数会在更改后将其值设置回0)。
程序还可以修改它的值。实际上,如果这个变量打算在库函数调用之后用于错误检查,则应该在调用之前由程序将其重置为0(因为以前对库函数的任何调用都可能更改了它的值)。
声明errno(<cerrno>)的同一个头文件也至少声明了以下宏常量,它们的值不等于0:
macro(宏) | meaning when errno is set to this(当errno设置为这个的意义) |
---|---|
EDOM | Domain error: Some mathematical functions are only defined for certain real values, which is called its domain, for example the square root function is only defined for non-negative numbers, therefore the sqrt function sets errno to EDOM if called with a negative argument.(定义域错误:一些数学函数只对某些实数定义,称为其定义域,例如,平方根函数只对非负数定义,因此,如果使用负数实参调用sqrt函数,则将errno设置为EDOM。) |
ERANGE | Range error: The range of values that can be represented with a variable is limited. For example, mathematical functions such as pow can easily outbound the range representable by a floating point variable, or functions such as strtod can encounter sequences of digits longer than the range representable values. In these cases, errno is set to ERANGE. (范围错误:可以用变量表示的值的范围是有限的。例如,像pow这样的数学函数可以很容易地超出浮点变量所能表示的范围,或者strtod这样的函数可以遇到比范围所表示的值更长的数字序列。在这些情况下,errno设置为ERANGE。) |
EILSEQ | Illegal sequence: Multibyte character sequence may have a restricted set of valid sequences. When a set of multibyte characters is translated by functions such as mbrtowc, errno is set to EILSEQ when an invalid sequence is encountered. (非法序列:多字节字符序列可能有一组受限制的有效序列。当mbrtowc等函数转换一组多字节字符时,当遇到无效序列时,errno将设置为EILSEQ。) |
标准库的函数可以将errno设置为任何值(不仅仅是上面列出的可移植值)。特定的库实现可以在此头文件中定义附加的名称。
C++11扩展了这个头文件中需要定义的基本值集,包括了许多在POSIX环境中也可用的名称,将可移植errno值的总数增加到78个。有关完整列表,请参考errc。
与错误值相关的特定错误消息可以使用strerror获得,也可以使用perror函数直接打印。
在C++中,errno总是声明为宏,但在C中,它也可以实现为具有外部链接的int对象。
数据竞争
支持多线程的库应该在每个线程的基础上实现errno:每个线程都有自己的本地errno。
这是符合C11和C++11标准的库的要求。