【发布时间】:2016-09-19 04:49:17
【问题描述】:
是否允许跳转到内部作用域或同级作用域内的标签?如果是,是否允许使用在该范围内声明的变量?
考虑这段代码:
int cond(void);
void use(int);
void foo()
{
{
int y = 2;
label:
use(y);
}
{
int z = 3;
use(z);
/* jump to sibling scope: */ if(cond()) goto label;
}
/* jump to inner scope: */ if(cond()) goto label;
}
这些gotos 合法吗?
如果是这样,当我跳转到 label 并保持分配给它的最后一个值 (2) 时,y 是否保证存在?
或者编译器是否允许假设y 在超出范围后不会被使用,这意味着单个内存位置可以同时用于y 和z?
如果此代码的行为未定义,我如何让 GCC 发出有关它的警告?
【问题讨论】:
-
你为什么还要使用
goto? -
@EdHeal 我只是想了解 C。我实际上并没有使用此代码。
-
goto's 对于打破(或进入)嵌套循环非常宝贵,否则考虑到break的限制,这些循环将有助于更长的或递归的解决方案。在这种情况下,小老goto是一个主力。 C 库经常使用goto。看看qsort源代码,如果我记得的话strlen等等。 -
@DavidC.Rankin,你忘记了
goto用于清理代码的简化,正如 Linux 内核反复证明的那样。