Должен ли я использовать system_category или generic_category для errno в Unix?
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 ответа
Вы должны сообщать об ошибках из ОС (любой, включая ОС на базе 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, рекомендуется определять значения, идентичные значениям операционной системы. Для ошибок, которые не происходят из операционной системы, реализация может предоставить перечисления для связанных значений. - конец примера]
Вы не должны использовать system_category
если вы на самом деле не операционная система (или не сообщаете об ошибке из функции, специфичной для ОС). Категория описывает происхождение ошибки, но не обязательно, что означает код ошибки. Поэтому вполне допустимо иметь набор возможных кодов ошибок от system_category
быть таким же, как generic_category
,