如何仅针对一组开关情况禁用“在开关中未明确处理的枚举值”?

时间:2018-10-23 18:38:20

标签: c++ clang qt-creator

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

总的来说,我认为发出警告非常有用,但是在这里,它抱怨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);
}

2 个答案:

答案 0 :(得分:2)

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

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

注意 GCC 必须是大写。

答案 1 :(得分:1)

如用户463035818的注释中所指出,可以通过添加#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);
}