Spec-Zone.ru › C

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>

См. также

E2BIG, EACCES, ..., EXDEV
макросы для стандартных условий ошибок, совместимых с POSIX
(макроконстанта)
perror
выводит строку символов, соответствующую текущей ошибке, в stderr
(функция)
strerrorstrerror_sstrerrorlen_s
(C11)(C11)
возвращает текстовое представление заданного кода ошибки
(функция)
math_errhandlingMATH_ERRNOMATH_ERREXCEPT
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API