【问题标题】:How to disable "enumeration value not explicitly handled in switch" just for one block of switch case?如何仅针对一个开关案例块禁用“开关中未明确处理的枚举值”?
【发布时间】:2018-10-23 18:38:19
【问题描述】:

您能告诉我如何仅针对一个开关/案例块禁用编译器/代码模型警告吗?

总的来说,我认为被警告是非常有用的,但是这里它抱怨在switch中没有明确处理的167个枚举值。

我发现了另一个问题:

c++ warning: enumeration value not handled in switch [-Wswitch]

它说您可以使用default: break; 消除警告,但在这种情况下(最近使用clang 的QtCreator)这不适用。

我知道我可以将代码更改为if/else if/else if ..,但我希望处理的案例列表会随着时间的推移而增加,所以我更愿意继续使用switch/case

所以,我的问题是,是否有任何关键字/宏/注释/属性表示仅针对单个块忽略该问题?

以下代码产生警告,其他 167 个值似乎是 QEvent::type() 的可能返回值,它们是 Qt 的一部分:

bool MyClass::event(QEvent * e) {
    switch(e->type()) {
    case QEvent::HoverEnter:
        qDebug() << "enter"; 
        return true;
    case QEvent::HoverLeave:
        qDebug() << "leave"; 
        return true;
    case QEvent::HoverMove:
        qDebug() << "move"; 
        return true;
    default:
        break;
    }
    return Piece::event(e);
}

【问题讨论】:

  • 这不是使用switch 的优势吗?当“处理的案件清单将随着时间的推移而增加”时,您不能轻易错过一个,因为您会收到警告。你能显示minimal reproducible example吗?看看为什么default 没有帮助会很有趣
  • 我猜有什么区别是“明确地”。您确实处理所有情况,但没有明确处理
  • 请在问题中逐字添加警告
  • this 不是真正的骗子,但问题有答案
  • 您可以发布自己问题的答案。我对clang不熟悉,也没有心情去确定足以写出答案,但是恕我直言,您的编辑应该是一个答案

标签: c++ clang qt-creator


【解决方案1】:

正如 user463035818 在评论中指出的那样,可以通过添加#pragma 来禁用特定代码部分的消息:

bool MyClass::event(QEvent * e) {
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wswitch"
    switch(e->type()) {
    case QEvent::HoverEnter:
        qDebug() << "enter"; 
        return true;
    case QEvent::HoverLeave:
        qDebug() << "leave"; 
        return true;
    case QEvent::HoverMove:
        qDebug() << "move"; 
        return true;
    default:
        break;
    }
    #pragma clang diagnostic pop
    return Piece::event(e);
}

【讨论】:

    【解决方案2】:

    除了 user2567875 发布的已接受答案外,如果您使用的是 GCC 构建工具,您可以像这样得到相同的答案:

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wswitch"
    switch(...)
    {
    ...
    }
    #pragma GCC diagnostic pop
    

    注意GCC 必须大写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多