errno
|
Определено в заголовочном файле
<errno.h>
|
||
|
#define errno /* implementation-defined */
|
||
errno
— это макрос препроцессора (но см. примечание ниже), который раскрывается в
поточно-локальное
(начиная с C11)
изменяемое lvalue типа
int
. Несколько функций стандартной библиотеки указывают на ошибки, записывая положительные целые числа в
errno
. Обычно значение
errno
устанавливается в один из кодов ошибок, перечисленных в
<errno.h>
в виде макроконстант, начинающихся с буквы
E
, за которой следуют заглавные буквы или цифры.
Значение
errno
равно
0
при запуске программы, и хотя библиотечным функциям разрешено записывать положительные целые числа в
errno
независимо от того, произошла ошибка или нет, библиотечные функции никогда не сохраняют
0
в
errno
.
Библиотечные функции
perror
и
strerror
могут быть использованы для получения текстовых описаний ошибок, соответствующих текущему значению
errno
.
Примечание: До стандарта C11 в стандартах C были противоречивые требования, поскольку они утверждали, что
errno
является макросом, но
также
что "не определено, является ли
errno
макросом или идентификатором, объявленным с внешней линковкой". C11 исправляет это, требуя, чтобы он определялся как макрос (см. также WG14
N1338
).
Пример
#include <errno.h> #include <math.h> #include <stdio.h> void show_errno(void) { const char *err_info = "unknown error"; switch (errno) { case EDOM: err_info = "domain error"; break; case EILSEQ: err_info = "illegal sequence"; break; case ERANGE: err_info = "pole or range error"; break; case 0: err_info = "no error"; } fputs(err_info, stdout); puts(" occurred"); } int main(void) { fputs("MATH_ERRNO is ", stdout); puts(math_errhandling & MATH_ERRNO ? "set" : "not set"); errno = 0; (void)(1.0 / 0.0); show_errno(); errno = 0; (void)acos(+1.1); show_errno(); errno = 0; (void)log(0.0); show_errno(); errno = 0; (void)sin(0.0); show_errno(); }
Возможный вывод:
MATH_ERRNO is set no error occurred domain error occurred pole or range error occurred no error occurred
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.5 Errors <errno.h> (стр: TBD)
-
- K.3.1.3 Use of errno (стр: TBD)
-
- K.3.2 Errors <errno.h> (стр: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.5 Ошибки <errno.h> (стр: TBD)
-
- K.3.1.3 Использование errno (стр: TBD)
-
- K.3.2 Ошибки <errno.h> (стр: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.5 Ошибки <errno.h> (стр: 205)
-
- K.3.1.3 Использование errno (стр: 584)
-
- K.3.2 Ошибки <errno.h> (стр: 585)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.5 Ошибки <errno.h> (стр: 186)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 4.1.3 Ошибки <errno.h>
Смотрите также
|
макросы для стандартных POSIX-совместимых условий ошибок
(макроконстанта) |
|
|
выводит строку символов, соответствующую текущей ошибке, в
stderr
(функция) |
|
|
(C11)
(C11)
|
возвращает текстовое описание заданного кода ошибки
(функция) |
|
(C99)
(C99)
(C99)
|
определяет механизм обработки ошибок, используемый общими математическими функциями
(макроконстанта) |
|
C++ documentation
для
errno
|
|