当前位置 博文首页 > dadalaohua的博客:【GNU笔记】【C扩展系列】局部声明的标签

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

    作者:[db:作者] 时间:2021-07-11 10:08

    【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

    cs