【问题标题】:Error C2360: Initialization of 'hdc' is skipped by 'case' label错误 C2360:“case”标签跳过了“hdc”的初始化
【发布时间】:2013-12-09 06:13:52
【问题描述】:

以下两个定义中产生错误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;
}

【问题讨论】:

  • 这是一个 C++ 规则。只需将 { 大括号 } 放在它周围。

标签: c++ switch-statement


【解决方案1】:

当一个变量在一种情况下被声明时,下一种情况在技术上仍然在同一个范围内,所以你可以在那里引用它,但是如果你在没有先点击这个情况的情况下点击那个情况,你最终会调用一个未初始化的变量。这个错误可以防止这种情况发生。

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

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

【讨论】:

    【解决方案2】:

    第一个是合法的,第二个是不合法的。有时允许跳过没有初始化器的声明,但绝不允许跳过带有初始化器的声明。

    Storage allocation of local variables inside a block in c++

    【讨论】:

    • 有没有更好的方法来初始化hdc?
    • 正如汉斯所说,将整个块放在大括号中 - 问题在于范围。最好还是把它移到一个单独的方法中,否则很容易得到一个几百行的 switch 语句。
    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2015-10-09
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多