20

我对 和 之间的确切关系感到GetLastError()困惑errno。它们是相同的数值,还是完全不同的东西?我怎么知道我应该检查哪一项?

如果我想将错误代码转换为字符串进行调试,我可以与 ?FormatMessageA()互换使用strerror_s()

WSAGetLastError()最后,总是返回与 相同的值是真的GetLastError(),还是它们都返回不同的值?

4

1 回答 1

22

GetLastError 和 errno 之间没有关系。

GetLastError 获取由 Windows API 函数(针对当前线程)设置的最后一个错误,而 errno 包含由 C 运行时库函数(也针对当前线程)存储到其中的最后一个错误。

几乎所有向其调用者返回错误的 WinAPI 函数都会以某种方式指示何时发生错误,然后通过调用 GetLastError 为调用者设置错误。注意:并非所有 WinAPI 函数都向其调用者返回错误。

例如,WinAPI 函数 CreateFile 的文档说:

如果函数成功,则返回值是指定文件、设备、命名管道或邮槽的打开句柄。如果函数失败,则返回值为 INVALID_HANDLE_VALUE。要获取扩展错误信息,请调用 GetLastError。

将错误返回给调用者的 C 运行时库函数将以某种方式指示何时发生错误,然后在 errno 中存储一个值。注意:并非所有 C 运行时库函数都向其调用者返回错误。

例如,C 运行时库函数 sqrt 的文档说:

sqrt 函数计算其参数的非负平方根。如果其参数为负,则会发生域错误。

关于域错误的文档说:

在域错误时,该函数返回一个实现定义的值;并且值 EDOM 存储在 errno 中。

GetLastError 返回的值与 errno 中存储的值不同,所以我认为这回答了有关使用 FormatMessage 和 strerror_s 的问题。

我不知道 WSAGetLastError 是否总是返回与 GetLastError 相同的值(尽管我注意到 GetLastError 返回的错误代码列表确实包含 WSAGetLastError 可以返回的错误代码)。请参阅系统错误代码 (9000-11999)。如果您查看从大约 10000 开始的错误代码,您将看到 WSAGetLastError 错误代码。

无论如何,我个人不会依赖它们返回相同的值。为什么会有用?只需按照文档并为 Winsock2 函数调用 WSAGetLastError,为其他 WinAPI 函数调用 GetLastError。注意:您可以对任一函数返回的错误代码使用 FormatMessage。

于 2013-11-18T20:37:12.353 回答