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

Code before first case in switch statement

请注意,这是一个关于 C++ 语言的问题,而不是关于我给出的例子有多真实或有用。

假设我们在一个(或多个)命名空间中有一个 enum

namespace SomeVeryLargeNamespaceExample {
    enum class E {
        One,
        Two,
    };
}

现在,我们想在 switch 语句的表达式中使用它。今天我发现可以在switch语句中添加using SomeVeryLargeNamespaceExample::E,在第一个case之前,减少case中的代码混乱:

switch (e) {
    using SomeVeryLargeNamespaceExample::E;
case E::One:
    std::cout << "One\n";
    break;
case E::Two:
    std::cout << "Two\n";
    break;
}

乍一看,我以为这是某种我从未了解过的“在任何 case 语句之前执行此操作”的功能,但是某些表达式(例如函数调用)不会执行(实际上,gcc 会生成警告statement will never be executed [-Wswitch-unreachable])。另一方面,变量声明是可能的(但不是初始化)。

我的问题是,还有哪些可能的陈述?这是switch设计的一个特点还是结果

注意:我找到了 this other question,但它是特定于 C 的(因此它没有提到命名空间的情况,例如),我对 C++ 很好奇。

任何有效的 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;
  |