gcc扩展2-局部标签locally declared labels的定义

定义:
_ _ 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 })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值