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

问题描述 投票:15回答:1

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

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

最后,WSAGetLastError()总是返回与GetLastError()相同的事实,还是它们都返回不同的值?

c windows errno getlasterror
1个回答
14
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.