gcc对C语言的扩展:局部标签声明(Locally Declared Labels)
生活随笔
收集整理的這篇文章主要介紹了
gcc对C语言的扩展:局部标签声明(Locally Declared Labels)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
每個語句內嵌表達式都是一個可以聲明局部跳轉標簽的域。一個局部標簽只是一個標識符:你可以使用通常的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; ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
})
一個局部標簽的申明如下:
__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; ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
})
轉載于:https://blog.51cto.com/nathanxu/6030
總結
以上是生活随笔為你收集整理的gcc对C语言的扩展:局部标签声明(Locally Declared Labels)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: swift 第四课 随意 设置butto
- 下一篇: 锤子手机T2发布会PPT模板