我应该在Unix上使用system_category或generic_category作为errno吗?

时间:2011-09-25 00:24:39

标签: unix error-handling c++11 errno system-error

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()值?)

2 个答案:

答案 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相同是完全合法的。