我对 和 之间的确切关系感到GetLastError()
困惑errno
。它们是相同的数值,还是完全不同的东西?我怎么知道我应该检查哪一项?
如果我想将错误代码转换为字符串进行调试,我可以与 ?FormatMessageA()
互换使用strerror_s()
?
WSAGetLastError()
最后,总是返回与 相同的值是真的GetLastError()
,还是它们都返回不同的值?
我对 和 之间的确切关系感到GetLastError()
困惑errno
。它们是相同的数值,还是完全不同的东西?我怎么知道我应该检查哪一项?
如果我想将错误代码转换为字符串进行调试,我可以与 ?FormatMessageA()
互换使用strerror_s()
?
WSAGetLastError()
最后,总是返回与 相同的值是真的GetLastError()
,还是它们都返回不同的值?
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。