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

Sté*_*ane 15 c windows errno getlasterror

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

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

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

Stu*_*art 15

GetLastError和errno之间没有关系.GetLastError获取Windows API函数中发生的最后一个错误(对于当前线程).errno包含C运行时库中发生的最后一个错误(我认为这也是Microsoft C运行时库的特定于线程).因此,如果您调用类似CreateFile的winapi函数,则检查GetLastError(假设函数调用失败),而如果您调用Copen库函数(如fopen),则检查errno(再次假设调用失败).

我认为这也回答了有关使用FormatMessage和strerror_s的问题.

我不知道WSAGetLastError是否总是返回与GetLastError相同的值(尽管我注意到GetLastError返回的错误代码列表包含WSAGetLastError可以返回的错误代码).请参阅系统错误代码(9000-11999).如果查看从10000左右开始的错误代码,您将看到WSA​​GetLastError错误代码.

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