switch语句中第一个case之前的代码

4
请注意,这是关于C++语言的问题,而不是关于我提供的示例有多真实或有用的问题。
假设我们在一个命名空间(或多个命名空间)中有一个枚举类型:
namespace SomeVeryLargeNamespaceExample {
    enum class E {
        One,
        Two,
    };
}

现在,我们希望在switch语句的表达式中使用它。今天我发现可以在第一个case之前在switch语句中添加using SomeVeryLargeNamespaceExample::E,从而减少case中的代码混乱。
switch (e) {
    using SomeVeryLargeNamespaceExample::E;
case E::One:
    std::cout << "One\n";
    break;
case E::Two:
    std::cout << "Two\n";
    break;
}

乍一看,我以为这是一种“在任何情况语句之前执行此操作”的功能,但某些表达式(如函数调用)不会被执行(实际上,gcc生成警告 statement will never be executed [-Wswitch-unreachable])。另一方面,变量声明是可能的(但不是初始化)。
我的问题是,还有哪些语句是可能的?这是一项功能还是仅是switch设计的结果 注意:我发现this other question,但它只适用于C(因此没有提到命名空间case,例如),而我对C++很感兴趣。
1个回答

2

任何有效的C++语句都是可能的:

int a;

void foo(int x)
{
    switch (x) {
        a=4;
    case 0:
        a=1;
        break;
    case 1:
        a=2;
        break;
    }
}

这是语法上有效的C++代码,gcc编译器可以将其编译成可执行文件。但是,初始语句无法到达。因此,每个现代的C++编译器都会给出警告信息:

t.C: In function ‘void foo(int)’:

t.C:8:18: warning: statement will never be executed [-Wswitch-unreachable]

8 |                 a=4;
  |

谢谢!有没有办法知道哪些语句会产生影响(例如示例中的 using)?我猜那些不会生成实际代码但会指导编译器的语句,是吗? - cbuchart
1
你的假设是正确的。并没有某种主列表,列出哪些C++语句不会生成代码。但随着你继续学习C++,你会逐渐了解每个语句的含义。 - Sam Varshavchik
1
@cbuchart • 可以使用Duff's device进行实际目的,将do {放在第一个case之前。 - Eljay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接