首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转到VLA范围

转到VLA范围
EN

Stack Overflow用户
提问于 2017-02-21 04:11:53
回答 2查看 148关注 0票数 2

允许这样做吗?

代码语言:javascript
复制
goto inside;
{
inside:
int a[n];
}

goto语句不应从具有可变修改类型的标识符范围外跳转到该标识符范围内。

反过来说呢?

代码语言:javascript
复制
{
goto outside;
int a[n];
}
outside: ;

代码语言:javascript
复制
{
int a[n];
goto outside;
}
outside: ;

他们是一样的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-21 04:21:55

第一个是不允许的,但原因是不能将标签应用于声明。

标签位于VLA的作用域之前,如果有可执行代码(形式上是语句,甚至是空的语句)就可以标记,那么您就可以了:

代码语言:javascript
复制
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节,但措辞是相同的。

票数 5
EN

Stack Overflow用户

发布于 2017-02-21 04:23:39

使用goto退出包含VLA的作用域是非常好的。这与使用returnbreak退出该作用域没有什么不同。

使用goto输入VLA作用域的问题是,VLA声明被视为包含一些代码,这些代码调用alloca()来为数组保留堆栈空间。如果使用goto跳过声明,也跳过了alloca()调用,因此可能没有为数组保留任何空间。

请注意,撇开alloca()不说,这与跳过变量初始化(例如,int n = 1)并没有太大的不同。就像他们总是有一个初始化程序一样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42358542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档