首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetLastError()、errno、FormatMessageA()和strerror_s()?

GetLastError()、errno、FormatMessageA()和strerror_s()?
EN

Stack Overflow用户
提问于 2013-11-19 04:08:58
回答 1查看 10K关注 0票数 19

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-19 04:37:12

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

在任何情况下,我个人都不会依赖它们返回相同的值。这有什么用呢?只需按照文档进行操作,并为Winsock2函数调用WSAGetLastError,为其他WinAPI函数调用GetLastError。注意:您可以对任一函数返回的错误码使用FormatMessage。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20056851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档