gpt4 book ai didi

c++ - 为什么 GetLastError() 会根据调用方式返回 0 或 2?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:36 24 4
gpt4 key购买 nike

我正在使用 mingw g++ 4.6.1 和 -O0,WinXP SP2。

Minimal working example is here.

g++ 配置了 --disable-sjlj-exceptions --with-dwarf2。

GetLastError() 根据抛出异常的方式返回 0 或 2:

throw runtime_error(error_message());

伪造的“错误代码:0”被打印出来,并且

const string msg = error_message();

throw runtime_error(msg);

按预期打印“错误代码:2”。

首先,我认为 GetLastError() 被调用了两次,但调试显示它只被调用了一次,正如预期的那样。

这是怎么回事?

最佳答案

设置throw 的代码可能会在某处调用自身内部的 Win32 API 函数,将 Last-Error 值重置为 0。这可能发生在之前 您对 error_message() 的调用。

调用 GetLastError() 不会自动将 Last-Error 值重置为 0,因此调用两次是安全的。

您的编译器/运行时是否生成调用 Win32 API 函数的代码将取决于您的特定运行时。为了安全且不依赖于此,请使用双语句版本:

const string msg = error_message();
throw runtime_error(msg);

更好的是,对于您代码的 future 读者来说,在 error_message() 之外调用 GetLastError() 会很有用:

const string msg = error_message(GetLastError());
throw runtime_error(msg);

这样,读者将在相应的 Win32 API 调用之后立即看到 GetLastError() 调用,这是它所属的位置。

关于c++ - 为什么 GetLastError() 会根据调用方式返回 0 或 2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8671483/

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