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