GetLastError(),errno,FormatMessageA()和strerror_s()?

时间:2013-11-18 20:08:58

标签: c windows errno getlasterror

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

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

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

1 个答案:

答案 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左右开始的错误代码,您将看到WSA​​GetLastError错误代码。

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