考虑以下代码:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC和Clang reject it,因为跳转到
bar:
会绕过变量初始化。 MSVC完全不提示(在x
引起警告之后使用bar:
除外)。我们可以使用
switch
做类似的事情:void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
现在,所有三个编译器emit errors。
这些代码片段格式不正确吗?还是引起UB?
我曾经以为两者都是不正确的形式,但是我找不到标准的启示部分。 [stmt.goto]对此没有说什么,[stmt.select]也没有说。
最佳答案
初始化不为空时,它的格式不正确。
初始化程序使初始化成为非空的。相比之下,这
void foo()
{
goto bar;
int x; // no initializer
bar: ;
}
格式正确。尽管有关使用带有不确定值的
x
的通常警告会适用。