C ++ 0x有两个预定义的error_category
个对象:generic_category()
和system_category()
。根据我到目前为止所理解的,system_category()
应该用于操作系统返回的错误,并且generic_category()
应该用于std::errc
中找到的通用值,它们对应于{{ 1}}值。
但是,在类似Unix的系统上应该做些什么,其中errno
值是操作系统返回的错误?我应该使用errno
(在非类Unix系统上会出错,需要system_category()
),还是应该使用#ifdef
(在类Unix系统上会出错?非标准generic_category()
值?)
答案 0 :(得分:2)
您应该使用system_category()
报告来自OS(任何一个,包括基于POSIX的操作系统,如Unix)的错误,如C ++标准库函数所做的那样 - 请参阅下面的C ++ 11标准引用:
17.6.5.14错误代码的值[value.error.codes]
1 C ++标准库中的某些函数通过std :: error_code(19.5.2.1)对象报告错误。的即 object的category()成员应返回std :: system_category()以查找源自操作的错误 system ,或对实现定义的error_category对象的引用,用于发生错误 别处。实现应为每个错误类别定义value()的可能值。 [示例:对于基于POSIX的操作系统,鼓励实现定义 std :: system_category()的值与POSIX errno值相同,并且定义了其他值 通过操作系统的文档。不基于的操作系统的实现 我们鼓励在POSIX上定义与操作系统值相同的值。对于那些错误 不是源自操作系统,实现可以提供关联值的枚举。 - 例子]
答案 1 :(得分:1)
除非您实际上是操作系统(或报告来自特定于操作系统的功能的错误),否则不应使用system_category
。该类别描述了错误的起源,而不一定是错误代码的含义。因此,system_category
中可能的错误代码集与generic_category
相同是完全合法的。