对于Unix上的errno,我应该使用system_category还是generic_category?
C++0x有两个预定义的对于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
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:这是一个复杂的、过度设计的混乱。如何正确使用它?没有人知道。。。(参见此线程)。