我有一个类似于switch
语句的程序:
switch(n)
{
case 0:
/* stuff */
break;
int foo;
case 1:
foo = 5;
break;
case 2:
foo = 6;
break;
}
请注意int foo;
和case 0
之间的case 1
。这句话是无法达到的:如果你完成了这个程序,你就永远不会跨过它。
这可以在没有警告或错误的情况下编译Clang,但是当我运行时它似乎被抬起(虽然这可能是由于其他原因)。
在无法访问的语句中声明变量并在可到达的语句中使用它是否定义良好的行为,它是否会起作用?
答案 0 :(得分:5)
只要变量具有简单的构造,并且(大约)具有明确定义的行为 与在较大范围内声明变量的效果相同。
如果需要进行任何初始化,您将收到错误。
第6.7节说
可以转换为块,但不能以初始化绕过声明的方式。从具有自动存储持续时间的变量不在范围内的点跳转到其在范围内的点的程序是不正确的,除非变量具有标量类型,具有普通默认构造函数的类类型和普通的析构函数,这些类型之一的cv限定版本,或者前面类型之一的数组,并且在没有初始化器的情况下声明。