每個語句內嵌表達式都是一個可以聲明局部跳轉標籤的域。 一个局部标签只是一个标识符:你可以使用通常的goto语句跳到它--但是只能在它所属的域内这么做。 一個局部標籤只是一個標識符:你可以使用通常的goto語句跳到它--但是只能在它所屬的域內這麼做。
一个局部标签的申明如下: 一個局部標籤的申明如下:
__label__ label; __label__ label;
或者: 或者:
__label__ label1, label2, ...; __label__ label1, label2, ...;
局部标签的申明必须在语句内嵌表达式的开始出,紧跟({后面,在所有通常申明的左边。局部标签申明只是定义了标签的名字,但是并没有定义标签本身。 你必须用通常的标签使用方法来在语句内嵌表达式内部使用局部标签。 局部標籤的申明必須在語句內嵌表達式的開始出,緊跟({後面,在所有通常申明的左邊。局部標籤申明只是定義了標籤的名字,但是並沒有定義標籤本身。你必須用通常的標籤使用方法來在語句內嵌表達式內部使用局部標籤。

由于语句内嵌表达式经常用于宏,所以局部标签特性非常有用。 由於語句內嵌表達式經常用於宏,所以局部標籤特性非常有用。 如果在宏里包含了循环,一个goto能很有效的跳出循环。 如果在宏裡包含了循環,一個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;                             \
}) 

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()