在使用代码时,我遇到了一个有趣的特性。我使用的是打开了Cygwin和C++14 (-std=c++14)的Eclipse CDT 4.5.2。CASE中的变量初始化通常是被禁止的,但是下面的代码会编译:
switch( int switchStatement = 11)
{
default:
++j;
break; // break is optional, still compiles even if omitted
case 11:
int caseVariable = 0;
++j;
}如果添加了另一个案例,则会引发异常“跳转到案例标签”。
switch( int switchStatement = 11)
{
default:
++j;
case 11:
int caseVariable = 0;
++j;
case 12: // exception
++j;
}有人能给我解释一下它是怎么工作的吗?
发布于 2016-09-25 03:27:19
为什么在last case语句中声明变量时,在第二个case语句中出现错误,但没有出现错误?
因为跳转不能传递同一作用域中的变量声明,这是C++的一条规则。所以当你跳到第二种情况时,你会跳过第一种情况中的变量声明,但最后一种情况中的变量声明是OK的,因为它从来没有跳过。
该规则的原因是,如果允许跳过变量声明,编译器将很难确定是否为该变量调用析构函数。如果你跳过了变量声明,你就不需要调用析构函数,如果你没有跳过,你就会调用。
在一个case语句中声明和初始化的变量在其他case块中仍然可见,但它们不会被初始化,因为初始化代码属于另一个case。
在C++中,问题是有范围的。在这里,case语句是“标签”。因此,编译器将它们视为从一条语句跳转到另一条语句。在这个特定的例子中,编译器不会理解如何继续下去。要解决此问题,您可以将case中的代码包含到{}块中。额外的{和}表示编译器可以毫不费力地确定何时调用析构函数。因此,在声明新变量时为特定的case语句提供作用域或大括号是很重要的。
https://stackoverflow.com/questions/39679871
复制相似问题