当前位置 博文首页 > dadalaohua的博客:【GNU笔记】【C扩展系列】局部声明的标签
GCC 允许你在任何嵌套块范围内声明局部标签。局部标签就像普通标签一样,但你只能在声明它的块中引用它(使用goto语句,或者通过获取其地址)。
局部标签声明如下所示:
__label__ label;
或者
__label__ label1, label2, /* … */;
局部标签声明必须位于块的开头,在任何普通声明或语句之前。
标签声明定义了标签名称,但没有定义标签本身。你必须用通常的方法,在语句表达式的语句中用label
:来完成此操作。
局部标签功能对于复杂的宏很有用。如果宏包含嵌套循环,则goto
可用于中断这些循环。但是,不能使用作用域为整个函数的普通标签:如果宏可以在一个函数中展开多次,则该标签在该函数中被多次定义。局部标签可避免此问题。例如:
#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)
这也可以使用语句表达式来写:
#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; \
})
局部标签声明还使它们声明的标签对嵌套函数可见(如果有的话)。有关详细信息,请参阅嵌套函数Nested Functions。
6.2 Locally Declared Labels
cs