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

对于Unix上的errno,我应该使用system_category还是generic_category?,unix,error-handling,c++11,errno,system-error,Unix,Error Handling,C++11,Errno,System Error,C++0x有两个预定义的error\u category对象:generic\u category()和system\u category()。根据我到目前为止的理解,system\u category()应用于操作系统返回的错误,而generic\u category()应用于std::errc中的通用值,它们对应于errno值 但是,在类Unix系统上应该做什么,其中errno值是操作系统返回的错误?我应该使用system\u category()(这在非Unix类系统上是错误的,需要\if

C++0x有两个预定义的
error\u category
对象:
generic\u category()
system\u category()
。根据我到目前为止的理解,
system\u category()
应用于操作系统返回的错误,而
generic\u category()
应用于
std::errc
中的通用值,它们对应于
errno


但是,在类Unix系统上应该做什么,其中
errno
值是操作系统返回的错误?我应该使用
system\u category()
(这在非Unix类系统上是错误的,需要
\ifdef
),还是应该使用
generic\u category()
(对于非标准
errno
值,在Unix类系统上是错误的)?

除非您实际上是操作系统(或报告操作系统特定功能的错误),否则不应使用
system\u category
。类别描述了错误的来源,而不一定是错误代码的含义。因此,让
system\u category
中的一组可能的错误代码与
generic\u category

相同是完全合法的,您可以使用
system\u category()从操作系统(包括基于POSIX的操作系统,如Unix)报告错误作为C++标准库函数,参见下面的C++ 11标准:

17.6.5.14错误代码值[值.错误.代码]

1 C++标准库中的某些函数通过STD::Error代码(19.5.2.1)对象报告错误。strong>那个 对象的category()成员应返回std::system_category(),以查找源于操作系统的错误 系统,或对源于错误的实现定义的错误\u类别对象的引用 在别处实现应为每个错误类别定义value()的可能值。 [示例:对于基于POSIX的操作系统,鼓励实现定义 std::system_category()值与POSIX errno值相同,并定义了其他值 根据操作系统的文档。不基于 建议在POSIX上定义与操作系统值相同的值 并非源于操作系统,实现可能会为相关值提供枚举。 -[结束示例]


让我们看看我是否得到了它:我应该始终使用
system\u category()
,因为
errno
值来自操作系统函数(或者来自调用操作系统函数的函数,或者来自调用…)的函数。但是在Win32上该怎么办呢,因为
system\u category()
将用于
GetLastError()
值,而C库函数将在
errno
中报告错误?@CesarB-听起来与Nicol Bolas写的完全相反如果errno已经由您调用的函数设置,为什么要处理它呢?但是如果你真的需要搞乱它,Nicol建议你使用
generic\u category
@Marc:我正在调用一个设置errno的函数(例如
epoll\u ctl
open
),如果出现错误,我想抛出一个
system\u error
(包装errno)
errno
来自Unix上的libc(它是操作系统的一部分)。在Windows上,
errno
来自C运行时,它不一定是操作系统的一部分。而且您不能在Windows上对
errno
使用
system\u category
,因为这应该是为本机Windows错误保留的。但是,如果您使用
fopen
,在这两种情况下,您都希望处理相同的
errno
。在阅读了答案后,我仍然不确定该使用什么。@robert:这是一个复杂的、过度设计的混乱。如何正确使用它?没有人知道。。。(参见此线程)。