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;
|
请注意,这是一个关于 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; |