gpt4 book ai didi

c - GetLastError()、errno、FormatMessageA() 和 strerror_s()?

转载 作者:可可西里 更新时间:2023-11-01 12:25:32 25 4
gpt4 key购买 nike

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com