每個語句内嵌表達式都是一個可以聲明局部跳轉标簽的域。一個局部标簽隻是一個辨別符:你可以使用通常的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; \
})
本文轉自nathanxu 51CTO部落格,原文連結:http://blog.51cto.com/nathanxu/6030,如需轉載請自行聯系原作者