11

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值是错误的)?

4

2 回答 2

2

您应该使用 C++ 标准库函数报告来自操作系统(任何一个,包括基于 POSIX 的操作系统,如 Unix)的错误system_category()- 请参阅下面 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 的操作系统的实现定义与操作系统值相同的值。对于并非源自操作系统的错误,实现可以为相关值提供枚举。—结束示例]

于 2015-01-03T22:01:05.810 回答
1

You should not use system_category unless you are in fact the operating system (or reporting an error from an OS-specific function). The category describes where the error originates from, not necessarily what the error code means. So it is perfectly legitimate to have the set of possible error codes from system_category be the same as generic_category.

于 2011-09-25T00:48:17.467 回答