Должен ли я использовать system_category или generic_category для errno в Unix? - PullRequest
6 голосов
/ 25 сентября 2011

C ++ 0x имеет два предопределенных объекта error_category: generic_category() и system_category(). Из того, что я понял до сих пор, system_category() следует использовать для ошибок, возвращаемых операционной системой, а generic_category() следует использовать для общих значений, найденных в std::errc, которые соответствуют errno значениям.

Однако, что следует делать в Unix-подобных системах, где errno значения являются ошибками, возвращаемыми операционной системой? Должен ли я использовать system_category() (что было бы неправильно в не-Unix-подобных системах, требующих #ifdef), или я должен использовать generic_category() (что было бы неправильно в Unix-подобных системах для нестандартных errno значения)?

Ответы [ 2 ]

2 голосов
/ 04 января 2015

Вы должны сообщать об ошибках из ОС (любой, включая ОС на основе POSIX, например Unix), используя system_category(), как это делают стандартные функции библиотеки C ++ - см. Цитату из стандарта C ++ 11 ниже:

17.6.5.14 Значение кодов ошибок [value.error.codes]

1 Некоторые функции в стандартной библиотеке C ++ сообщают об ошибках через объект std :: error_code (19.5.2.1). Элемент category () этого объекта должен возвращать std :: system_category () для ошибок, происходящих из операционной системы , или ссылку на определенный в реализации объект error_category для ошибок, возникающих в другом месте.Реализация должна определить возможные значения value () для каждой из этих категорий ошибок.[Пример: Для операционных систем, основанных на POSIX, реализациям рекомендуется определять значения std :: system_category () как идентичные значениям POSIX errno с дополнительными значениями, определенными в документации операционной системы.Реализации для операционных систем, которые не основаны на POSIX, рекомендуется определять значения, идентичные значениям операционной системы.Для ошибок, которые не происходят из операционной системы, реализация может предоставить перечисления для связанных значений.- конец примера]

1 голос
/ 25 сентября 2011

Не следует использовать system_category, если вы на самом деле не операционная система (или не сообщаете об ошибке из функции, специфичной для ОС).Категория описывает происхождение ошибки, но не обязательно, что означает код ошибки.Поэтому вполне допустимо, чтобы набор возможных кодов ошибок из system_category совпадал с generic_category.

...