功能范围

功能范围标签的特殊范围。这是由于他们不寻常的属性。甲标签是通过定义它的整个功能可见和一个能跳(使用指令 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);
}

CLEANUP1CLEANUP2 等标签是特殊标识符,其行为与所有其他标识符不同。它们在函数内部的任何地方都可见,即使在标记语句之前执行的地方也是如此,或者甚至在没有执行 goto 时也永远无法到达的地方。标签通常用小写而不是大写。