功能范围
功能范围是标签的特殊范围。这是由于他们不寻常的属性。甲标签是通过定义它的整个功能可见和一个能跳(使用指令 goto
label
从任何点在同一个函数),以它。虽然没用,但以下示例说明了这一点:
#include <stdio.h>
int main(int argc,char *argv[]) {
int a = 0;
goto INSIDE;
OUTSIDE:
if (a!=0) {
int i=0;
INSIDE:
printf("a=%d\n",a);
goto OUTSIDE;
}
}
INSIDE
可能似乎限定内部的 if
块,因为它是该范围块为 i
的情况下,但实际上并非如此。它在整个函数中可见,如 goto INSIDE;
所示。因此,在单个函数中不能有两个具有相同标识符的标签。
可能的用法是以下模式来实现分配的资源的正确复杂清理:
#include <stdlib.h>
#include <stdio.h>
void a_function(void) {
double* a = malloc(sizeof(double[34]));
if (!a) {
fprintf(stderr,"can't allocate\n");
return; /* No point in freeing a if it is null */
}
FILE* b = fopen("some_file","r");
if (!b) {
fprintf(stderr,"can't open\n");
goto CLEANUP1; /* Free a; no point in closing b */
}
/* do something reasonable */
if (error) {
fprintf(stderr,"something's wrong\n");
goto CLEANUP2; /* Free a and close b to prevent leaks */
}
/* do yet something else */
CLEANUP2:
close(b);
CLEANUP1:
free(a);
}
CLEANUP1
和 CLEANUP2
等标签是特殊标识符,其行为与所有其他标识符不同。它们在函数内部的任何地方都可见,即使在标记语句之前执行的地方也是如此,或者甚至在没有执行 goto
时也永远无法到达的地方。标签通常用小写而不是大写。