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

时间:2013-11-24 17:24:01

标签: c++ winapi switch-statement

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

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

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

2 个答案:

答案 0 :(得分:9)

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

请参阅Storage allocation of local variables inside a block in c++

答案 1 :(得分:1)

在一种情况下声明变量时,从技术上讲,下一种情况在技术上仍处于相同的范围内,因此您可以在那里引用它,但是如果在没有首先遇到该情况的情况下遇到该情况,则最终将调用未初始化的变量。此错误可以防止这种情况。

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

开关(msg){     情况WM_PAINT:     {         HDC hdc;         hdc = BeginPaint(hWnd,&ps);     }     打破; }