这是允许的吗?
goto inside;
{
inside:
int a[n];
}
Run Code Online (Sandbox Code Playgroud)
goto语句不应从具有可变修改类型的标识符范围之外跳转到该标识符的范围内.
反过来怎么样?
{
goto outside;
int a[n];
}
outside: ;
Run Code Online (Sandbox Code Playgroud)
和
{
int a[n];
goto outside;
}
outside: ;
Run Code Online (Sandbox Code Playgroud)
它们是一样的吗?
第一个是不允许的,但原因是你不能在声明中申请标签.
标签出现在VLA的范围之前,如果有标签的可执行代码(正式地,一个声明 ;甚至是空的那个),那么你就可以了:
goto inside;
{
inside:;
int a[n]; // Scope of a starts here!
}
Run Code Online (Sandbox Code Playgroud)
两个goto outside片段都很好.
讨论中的标识符范围以及数组a[n]进入范围时都有讨论.标准(C99和C11 - 在相同的部分编号中)说:
6.2.1标识符的范围
7Structure,union和enumeration标记的范围是在声明标记的类型说明符中标记出现之后开始的.每个枚举常量都具有在枚举器列表中定义枚举器出现之后开始的范围.任何其他标识符的范围都在其声明者完成之后开始.
它符合C90标准中的§6.1.2.1,但措辞是相同的.