允许这样做吗?
goto inside;
{
inside:
int a[n];
}goto语句不应从具有可变修改类型的标识符范围外跳转到该标识符范围内。
反过来说呢?
{
goto outside;
int a[n];
}
outside: ;和
{
int a[n];
goto outside;
}
outside: ;他们是一样的吗?
发布于 2017-02-21 04:21:55
第一个是不允许的,但原因是不能将标签应用于声明。
标签位于VLA的作用域之前,如果有可执行代码(形式上是语句,甚至是空的语句)就可以标记,那么您就可以了:
goto inside;
{
inside:;
int a[n]; // Scope of a starts here!
}两个goto outside片段都很好。
讨论了注释中标识符的范围,以及数组a[n]何时进入作用域。标准( C99和C11 -在同一节号中)说:
6.2.1标识符的范围 结构、联合和枚举标记的作用域在声明标记的类型说明符中标记出现后立即开始。每个枚举常量的作用域都是在其定义枚举数在枚举数列表中出现后开始的。任何其他标识符的作用域都是在其声明器完成后才开始的。
这是在C90标准的第6.1.2.1节,但措辞是相同的。
发布于 2017-02-21 04:23:39
使用goto退出包含VLA的作用域是非常好的。这与使用return或break退出该作用域没有什么不同。
使用goto输入VLA作用域的问题是,VLA声明被视为包含一些代码,这些代码调用alloca()来为数组保留堆栈空间。如果使用goto跳过声明,也跳过了alloca()调用,因此可能没有为数组保留任何空间。
请注意,撇开alloca()不说,这与跳过变量初始化(例如,int n = 1)并没有太大的不同。就像他们总是有一个初始化程序一样。
https://stackoverflow.com/questions/42358542
复制相似问题