我对GetLastError()
和errno
之间的确切关系感到困惑。它们是相同的数值,还是完全不同的东西?我怎么知道应该检查哪一个?
如果我想将错误代码转换为字符串以进行调试,我可以将FormatMessageA()
与strerror_s()
互换使用吗?
最后,WSAGetLastError()
是否总是与GetLastError()
返回相同,或者它们是否都返回不同的值?
答案 0 :(得分:11)
GetLastError和errno之间没有关系。 GetLastError获取Windows API函数中发生的最后一个错误(对于当前线程)。 errno包含C运行时库中发生的最后一个错误(我认为这也是Microsoft C运行时库的特定于线程)。因此,如果您调用类似CreateFile的winapi函数,则检查GetLastError(假设函数调用失败),而如果您调用Copen库函数(如fopen),则检查errno(再次假设调用失败)。
我认为这也回答了有关使用FormatMessage和strerror_s的问题。
我不知道WSAGetLastError是否总是返回与GetLastError相同的值(尽管我注意到GetLastError返回的错误代码列表包含WSAGetLastError可以返回的错误代码)。见System Error Codes (9000-11999)。如果查看从10000左右开始的错误代码,您将看到WSAGetLastError错误代码。
无论如何,我个人不会依赖它们返回相同的值。为什么这会有用?只需按照文档并为Winsock2函数调用WSAGetLastError,为其他winapi函数调用GetLastError。注意:您可以对任一函数返回的错误代码使用FormatMessage。