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(){constdouble 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 |