对于Unix上的errno,我应该使用system_category还是generic_category ?



c++有两个预定义的error_category对象:generic_category()system_category()。根据我目前的理解,system_category()应该用于操作系统返回的错误,generic_category()应该用于std::errc中找到的通用值,这些值对应于errno的值。

然而,在类unix系统上,errno是操作系统返回的错误,应该怎么做呢?我应该使用system_category()(这在非类unix系统上是错误的,需要#ifdef),还是应该使用generic_category()(这在类unix系统上对于非标准errno值是错误的)?

您应该使用system_category()作为c++标准库函数来报告来自操作系统(任何操作系统,包括基于posix的操作系统,如Unix)的错误-请参阅下面的c++ 11标准引用:

17.6.5.14错误码值[Value .error.codes]

c++标准库中的某些函数通过std::error_code(19.5.2.1)对象报告错误。,对象的category()成员应该返回std::system_category()system,或者是对错误产生的实现定义的error_category对象的引用其他地方。实现应该为每个错误类别定义value()的可能值。[示例:对于基于POSIX的操作系统,鼓励实现定义std::system_category()值与POSIX errno值相同,并带有定义的附加值通过操作系统的文档。非基于的操作系统的实现鼓励在POSIX上定义与操作系统值相同的值。对于这样的错误不是来自操作系统,实现可以为相关值提供枚举。-end example]

您不应该使用system_category,除非您实际上是操作系统(或报告来自操作系统特定函数的错误)。该类别描述了错误的来源,而不一定是错误代码的含义。因此,system_category的可能错误代码集与generic_category相同是完全合法的。

相关内容

  • 没有找到相关文章

最新更新