在任何情况下,在switch语句内使用声明是否合法?

时间:2019-09-26 08:12:09

标签: c++ switch-statement

以下代码在GCC 9.1(-Wall -Wextra -Werror -g)中可以很好地编译,没有任何警告或错误,但是clang-tidy给了我OCDFAInspection warning: unreachable code。例如,由于GCC在开关情况下具有所有这些附加值,例如整数范围,因此我担心这可能是另一个 addon 而不是有效的C ++。

那么以下代码在C ++中合法吗(如果重要的话,为17)?

namespace foo {
    void bar() {}
}

int main() {
    int n = 42;

    switch (n) {
        using namespace foo; // <- is this valid?
        case 42: 
            bar();
            break;
        default: 
            break;
    }
}

1 个答案:

答案 0 :(得分:4)

switch语句很有趣,因为它的语法类似于

switch (expression) statement

这里statement可以是 任何 语句。编译器在case的范围内以不同的方式对待关键字defaultbreakswitch,但否则,您可以拥有所需的任何语句,包括块语句(curly-brace)随附的语句列表)以及您想要的任何内容。

案例以外的泛型语句存在的问题是它们将不会被执行。生成的代码将跳到特定的case标签(或default大小写),并跳过不属于大小写的任何语句。

但是对于这种特定情况,如评论中所述,它是误报。这里使用的using指令指示编译器将名称空间foo添加到其符号查找中,但它本身不会创建或生成任何可执行代码。