以下代码在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;
}
}
答案 0 :(得分:4)
switch
语句很有趣,因为它的语法类似于
switch (expression) statement
这里statement
可以是 任何 语句。编译器在case
的范围内以不同的方式对待关键字default
,break
和switch
,但否则,您可以拥有所需的任何语句,包括块语句(curly-brace)随附的语句列表)以及您想要的任何内容。
案例以外的泛型语句存在的问题是它们将不会被执行。生成的代码将跳到特定的case
标签(或default
大小写),并跳过不属于大小写的任何语句。
但是对于这种特定情况,如评论中所述,它是误报。这里使用的using
指令指示编译器将名称空间foo
添加到其符号查找中,但它本身不会创建或生成任何可执行代码。