【问题标题】:Is a using declaration legal inside a switch statement before any cases?在任何情况下,switch 语句中的 using 声明是否合法?
【发布时间】:2019-09-26 08:12:09
【问题描述】:

以下代码在 GCC 9.1 (-Wall -Wextra -Werror -g) 中编译良好,没有任何警告或错误,但 clang-tidy 给了我OCDFAInspection warning: unreachable code。由于 GCC 有所有这些插件,例如 switch case 中的整数范围,我担心这可能是另一个 插件 而实际上不是有效的 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;
    }
}

【问题讨论】:

    标签: c++ switch-statement


    【解决方案1】:

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

    switch (expression) statement
    

    这里statement可以是任何声明。编译器在 switch 的范围内以不同的方式处理关键字 casedefaultbreak,但除此之外,您可以使用任何您想要的语句,包括块语句(大括号括起来的语句列表)和任何您想要的语句想要。

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

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

    【讨论】:

    • 那么警告是一个clang-tidy bug?
    • @nada - 误报。 using 指令仅影响块范围内的名称查找。它的“可达性”毫无意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多