1

最小的例子:

#include <Windows.h>
#include <string>
int main(int /*argc*/, char* /*argv*/[]) {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //Behavior the same, with or without.
    DWORD err = GetLastError();
    std::string str;
    return (int)err; //returns 127 iff line above uncommented, 0 iff commented
}

该程序返回127,对应于ERROR_PROC_NOT_FOUND(“找不到指定的过程。”)。请注意,在创建之前err设置。该程序使用 MSVC 2017 在调试模式下编译。std::string

这种行为是预期的吗?如果没有,我可以得到一些确认(然后,我会提交错误报告)?

4

1 回答 1

6

GetLastError()返回由该线程调用的 WinAPI 函数设置的最后一个错误代码。请注意,WinAPI 函数在成功时不一定设置代码:

大多数函数仅在失败时才调用 SetLastError 或 SetLastErrorEx。

您还没有调用失败的 WinAPI 函数。因此,错误代码是不确定的。它要么是未初始化的(意味着未定义的行为),要么是由未知函数设置的(只是稍微没有意义)。标准库使用异常来表示错误,而不是 Windows API。


“这种行为是预期的吗?”

由于该函数没有在适当的上下文中使用,因此任何值都是可以接受的,因此该行为是预期的。

于 2017-07-14T20:05:47.793 回答