我对GetLastError()和errno之间的确切关系感到困惑。它们是相同的数值,还是完全不同的数值?我怎么知道我应该检查哪一个?
如果我想要将错误代码转换为字符串进行调试,我是否可以与strerror_s()互换使用FormatMessageA()
最后,WSAGetLastError()是否总是返回与GetLastError()相同的值,或者它们是否都返回不同的值?
发布于 2013-11-19 04:37:12
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可以返回的错误代码)。参见System Error Codes (9000-11999)。如果您查看从大约10000开始的错误代码,您将看到WSAGetLastError错误代码。
在任何情况下,我个人都不会依赖它们返回相同的值。这有什么用呢?只需按照文档进行操作,并为Winsock2函数调用WSAGetLastError,为其他WinAPI函数调用GetLastError。注意:您可以对任一函数返回的错误码使用FormatMessage。
https://stackoverflow.com/questions/20056851
复制相似问题