【GNU笔记】【C扩展系列】局部声明的标签

这篇博客介绍了GCC编译器允许在块范围内声明局部标签的特性,这种标签仅在其声明的块内有效,用于解决宏展开时的标签冲突问题。文章通过一个示例展示了如何在宏中使用局部标签来中断嵌套循环,并提到了局部标签对嵌套函数的可见性。局部标签在编写复杂宏和管理控制流程时非常有用。
摘要由CSDN通过智能技术生成

【GNU笔记】【C扩展系列】局部声明的标签 Locally Declared Labels

局部声明的标签 Locally Declared Labels

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值