定义:
_ _ label _ _ label1, label, /* … */;
说明:
局部标签只能定义在某个块作用域里面,须在块的最开始声明,在一般变量定义声明的前面。标签相当于跳转语句的参考地址。当宏里面有标签时,标签只能定义在局部块里面,不能定义在整个宏函数空间里面,因为当多次引用宏时,会发生重复定义。当然,这也可以用宏声明来代替。
例子:
// An highlighted block
#define SEARCH(value, array, target) \
do { \
__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[i][j] == SEARCH_target)\
{ value = i; goto found;}
value)=-1;
found: ;
} while(0)
do {} while(0) 将标签放到局部块里,lable标签的生命周期在局部块里,多次引用该宏不会造成重复定义。
也可以用一个大的声明代替:
#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[i][j] == SEARCH_target)\
{ value = i; goto found;}
value)=-1;
found: ;
value;
})
声明的形式:
int x = ( { …; x })