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
|