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 Ошибки <errno.h> (с.: уточняется)
- K.3.1.3 Использование errno (с.: уточняется)
- K.3.2 Ошибки <errno.h> (с.: уточняется)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.5 Ошибки <errno.h> (с.: уточняется)
- K.3.1.3 Использование errno (с.: уточняется)
- K.3.2 Ошибки <errno.h> (с.: уточняется)
- Стандарт 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++ для errno |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/error/errno