user-0 提问: c/c++语言里的errno

回复:
user: user-1
content: 除了2L所说的情况外，还有perror函数的存在，即使出错也大多打印一条信息退出完事 Windows想要实现类似效果就必须先GetLastError然后FormatMessage然后输出  Windows API用GetLastError/SetLastError(Ex)而不是errno大概是考虑到兼容性， 而且这样实现线程独立（使用线程静态储存）也比较方便。 C/C++也是在C11/C++11才开始规定errno是线程静态的。

user: user-2
content: 引用 4 楼 caddor9100 的回复:[quote=引用 2 楼 akirya 的回复:] 1 errno是标准C里面的 Win32 还有个 WSAGetLastError 返回值无法表示错误的时候才会用类似这种方法，这种方法很不好  2 一般都尽可能的使用返回值表示错误，或者C++异常 引用 2 楼 akirya 的回复:1 errno是标准C里面的 Win32 还有个 WSAGetLastError 返回值无法表示错误的时候才会用类似这种方法，这种方法很不好  2 一般都尽可能的使用返回值表示错误，或者C++异常   通过每个函数的返回值来获取该函数的错误码，是很不好的，我敢说很有很多错误是有共性的，  所以windows 的getlasterror设计的比较好，可以获取通用性错误。  你想指望通过每个函数返回DOWRD来获取错误码，这样的话，就把api给设计死了。  每个api都是Dword类型，这明显不符合设计思路。  所以windwos在这里做的比较好。  再如有的第三方库，也有提供一个类似的api: 获取该第三方库的错误码。如 libcurl  而linux 则不这样子做，我不清楚linux为什么不提供一个类似getlasterror的api，也更不清楚，为什么linux  大部分api 不对errno设置值。  [/quote] win32 习惯是 非0成功，0失败。 无法根据返回值确定失败原因。 linux 0成功，其他失败，则可以根据返回值知道为啥失败。 个人觉得errno GetLastError之类的设计非常屎。本来一个函数的就能完成的操作，非得再调用个方法才知道为啥。 谁知道GetLastError得到的是前一个函数的错误，还是前前函数的错误。

user: user-3
content: _doserrno, errno, _sys_errlist, and _sys_nerr These global variables hold error codes used by the perror and strerror functions for printing error messages. Manifest constants for these variables are declared in STDLIB.H as follows:  extern int _doserrno;  extern int errno;  extern char *_sys_errlist[ ];  extern int _sys_nerr;  errno is set on an error in a system-level call. Because errno holds the value for the last call that set it, this value may be changed by succeeding calls. Always check errno immediately before and after a call that may set it. All errno values, defined as manifest constants in ERRNO.H, are UNIX-compatible. The values valid for 32-bit Windows applications are a subset of these UNIX values.   On an error, errno is not necessarily set to the same value as the error code returned by a system call. For I/O operations only, use _doserrno to access the operating-system error-code equivalents of errno codes. For other operations the value of _doserrno is undefined.  Each errno value is associated with an error message that can be printed using perror or stored in a string using strerror. perror and strerror use the _sys_errlist array and _sys_nerr, the number of elements in _sys_errlist, to process error information.  Library math routines set errno by calling _matherr. To handle math errors differently, write your own routine according to the _matherr reference description and name it _matherr.  The following errno values are compatible with 32-bit Windows applications. Only ERANGE and EDOM are specified in the ANSI standard.  Constant System Error Message Value  E2BIG Argument list too long 7  EACCES Permission denied 13  EAGAIN No more processes or not enough memory or maximum nesting level reached 11  EBADF Bad file number 9  ECHILD No spawned processes 10  EDEADLOCK Resource deadlock would occur 36  EDOM Math argument 33  EEXIST File exists 17  EINVAL Invalid argument 22  EMFILE Too many open files 24  ENOENT No such file or directory 2  ENOEXEC Exec format error 8  ENOMEM Not enough memory 12  ENOSPC No space left on device 28  ERANGE Result too large 34  EXDEV Cross-device link 18

user: user-0
content: 引用 2 楼 akirya 的回复:1 errno是标准C里面的 Win32 还有个 WSAGetLastError 返回值无法表示错误的时候才会用类似这种方法，这种方法很不好  2 一般都尽可能的使用返回值表示错误，或者C++异常 引用 2 楼 akirya 的回复:1 errno是标准C里面的 Win32 还有个 WSAGetLastError 返回值无法表示错误的时候才会用类似这种方法，这种方法很不好  2 一般都尽可能的使用返回值表示错误，或者C++异常   通过每个函数的返回值来获取该函数的错误码，是很不好的，我敢说很有很多错误是有共性的，  所以windows 的getlasterror设计的比较好，可以获取通用性错误。  你想指望通过每个函数返回DOWRD来获取错误码，这样的话，就把api给设计死了。  每个api都是Dword类型，这明显不符合设计思路。  所以windwos在这里做的比较好。  再如有的第三方库，也有提供一个类似的api: 获取该第三方库的错误码。如 libcurl  而linux 则不这样子做，我不清楚linux为什么不提供一个类似getlasterror的api，也更不清楚，为什么linux  大部分api 不对errno设置值。

user: user-4
content: linux中只有某些特定的系统调用在出错时才设置errno，大部分普通函数都是不设置errno的， VC++的实现我们是不可见的，但是肯定也是有errno这种机制的， 你可以把WSAGetLastError理解成取errno的函数，至于为什么这么做，可能跟他的实现机制有关， VC++并不严格遵循C++标准。

user: user-2
content: 1 errno是标准C里面的 Win32 还有个 WSAGetLastError 返回值无法表示错误的时候才会用类似这种方法，这种方法很不好  2 一般都尽可能的使用返回值表示错误，或者C++异常

user: user-5
content: 大多数情况下不关心调用失败的原因，只关心是否调用成功，所以errno用的不多