每一個語句內嵌表達式都是一個能夠聲明局部跳轉標籤的域。一個局部標籤只是一個標識符:你可使用一般的goto語句跳到它--可是隻能在它所屬的域內這麼作。
一個局部標籤的申明以下:
__label__ label;
或者:
__label__ label1, label2, ...;
局部標籤的申明必須在語句內嵌表達式的開始出,緊跟({後面,在全部一般申明的左邊。局部標籤申明只是定義了標籤的名字,可是並無定義標籤自己。 你必須用一般的標籤使用方法來在語句內嵌表達式內部使用局部標籤。
因爲語句內嵌表達式常常用於宏,因此局部標籤特性很是有用。若是在宏裏包含了循環,一個goto能頗有效的跳出循環。然而一般的標籤的做用域式整個函數,若是宏在一個函數中被屢次使用,標籤就會在這個函數中被重複定義。而局部標籤能避免這個問題。例如:
#define SEARCH(array, target) \
({ \
__label__ found; \
typeof (target) _SEARCH_target = (target); \
typeof (*(array)) *_SEARCH_array = (array); \
int i, j; \
int value; \
for (i = 0; i < max; i++) \
for (j = 0; j < max; j++) \
if (_SEARCH_array[j] == _SEARCH_target) \
{ value = i; goto found; } \
value = -1; \
found: \
value; \
})函數