错误C2360:'case'标签跳过'hdc'的初始化

Cub*_*i73 7 c++ winapi switch-statement

在以下两个定义中,产生错误C2360的巨大差异在哪里?

switch (msg) {
    case WM_PAINT:
        HDC hdc;
        hdc = BeginPaint(hWnd, &ps); // No error
        break;
}
Run Code Online (Sandbox Code Playgroud)

switch (msg) {
    case WM_PAINT:
        HDC hdc = BeginPaint(hWnd, &ps); // Error
        break;
}
Run Code Online (Sandbox Code Playgroud)

Ala*_*kes 9

第一个是合法的,第二个不是.有时允许在没有初始化程序的情况下跳过声明,但从不使用初始化程序.

请参阅c ++中块内局部变量的存储分配.


小智 7

当在一种情况下声明变量时,下一种情况从技术上讲仍然在相同的范围内,因此您可以在那里引用它,但如果您在没有先触及此情况的情况下触及该情况,则最终会调用未初始化的变量。这个错误可以防止这种情况发生。

您需要做的就是在 switch 语句之前定义它,或者使用大括号 { } 以确保它在退出特定情况之前超出范围。

switch (msg) {
    case WM_PAINT:
    {
        HDC hdc;
        hdc = BeginPaint(hWnd, &ps);
    } 
    break;
}
Run Code Online (Sandbox Code Playgroud)