errno
| Определено в заголовочном файле <cerrno>
|
||
#define errno /* определено-реализацией */ |
||
errno это макрос препроцессора, используемый для индикации ошибок. Он расширяется до static (до C++11)локального к потоку (начиная с C++11) изменяемого левостороннего значения типа int.
Некоторые стандартные библиотечные функции указывают на ошибки, записывая положительные целые числа в errno. Как правило, значение errno устанавливается равным одному из кодов ошибок, перечисленных в <cerrno> как макроконстанты, которые начинаются с буквы E, за которой следуют буквы в верхнем регистре или цифры.
При запуске программы значение errno равно 0, и хотя библиотечные функции могут записывать положительные целые числа в errno вне зависимости от того, произошла ошибка или нет, библиотечные функции никогда не сохраняют 0 в errno.
Пример
#include <cerrno>
#include <clocale>
#include <cmath>
#include <cstring>
#include <iostream>
int main()
{
const double not_a_number = std::log(-1.0);
std::cout << not_a_number << '\n';
if (errno == EDOM)
{
std::cout << "Сбой log(-1): " << std::strerror(errno) << '\n';
std::setlocale(LC_MESSAGES, "de_DE.utf8");
std::cout << "Или, на Немецком, " << std::strerror(errno) << '\n';
}
}
Возможный вывод:
nan
Сбой log(-1): Numerical argument out of domain
Или, на Немецком, Das numerische Argument ist ausserhalb des Definitionsbereiches
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 310 | C++98 | было неясно, является ли errno макросом или идентификаторомс внешним связыванием |
errno должен быть макросом
|
Смотрите также
| макросы для стандартных состояний ошибок, совместимых с POSIX (макроконстанта) | |
| выводит строку символов, соответствующую текущей ошибке, в stderr (функция) | |
| возвращает текстовую версию данного кода ошибки (функция) | |
Документация C по errno
| |