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