考虑以下代码:

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的通常警告会适用。

10-04 22:22
查看更多