Namespaces
Variants

errno

From cppreference.net
< c ‎ | error
Определено в заголовочном файле <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
(функция)
возвращает текстовое описание заданного кода ошибки
(функция)
определяет механизм обработки ошибок, используемый общими математическими функциями
(макроконстанта)
C++ documentation для errno