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

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

最后,是真的WSAGetLastError()总是返回与GetLastError()一样的返回值,还是它们都可以返回不同的值?

最佳答案

GetLastError和errno之间没有关系。
GetLastError获取Windows API函数(针对当前线程)设置的最后一个错误,而errno包含C运行时库函数(也针对当前线程)存储在其中的最后一个错误。
几乎所有将错误返回给调用者的WinAPI函数,都将以某种方式指示发生错误的时间,然后通过调用GetLastError来设置错误以供调用者获取。
注意:并非所有WinAPI函数都会向其调用者返回错误。
例如,WinAPI函数CreateFile的文档说:
如果函数成功,则返回值是指定文件,设备,命名管道或邮件插槽的打开句柄。如果函数失败,则返回值为INVALID_HANDLE_VALUE。若要获取扩展的错误信息,请调用GetLastError。
将错误返回给调用者的C运行时库函数将以某种方式指示何时发生错误,然后将值存储在errno中。
注意:并非所有C运行时库函数都会将错误返回给其调用方。
例如,C运行时库函数sqrt的文档说:
sqrt函数计算其参数的非负平方根。如果参数为负,则会发生域错误。
有关域错误的文档说:
在域错误时,该函数返回实现定义的值;值EDOM存储在errno中。
GetLastError返回的值与errno中存储的值不同,因此我认为这回答了有关使用FormatMessage和strerror_s的问题。
我不知道WSAGetLastError是否总是返回与GetLastError相同的值(尽管我注意到GetLastError返回的错误代码列表的确包含了WSAGetLastError可以返回的错误代码)。参见System Error Codes (9000-11999)。如果查看从10000开始的错误代码,您将看到WSA​​GetLastError错误代码。
无论如何,我个人都不希望它们返回相同的值。为什么这样有用?只需按照文档操作,为Winsock2函数调用WSAGetLastError,为其他WinAPI函数调用GetLastError。注意:您可以在两个函数返回的错误代码上使用FormatMessage。

关于c - GetLastError(),errno,FormatMessageA()和strerror_s()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20056851/

10-12 04:43