功能範圍

功能範圍標籤的特殊範圍。這是由於他們不尋常的屬性。甲標籤是通過定義它的整個功能可見和一個能跳(使用指令 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 時也永遠無法到達的地方。標籤通常用小寫而不是大寫。