[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 局所的に宣言されたラベル

局所ラベルは、複文式のスコープで宣言することができる。 局所ラベルは単なる識別子である。 普通の goto 文を使ってそこにジャンプすることが出来るが、 ジャンプ元は局所ラベルの属する複文式の中に限られる。

局所ラベルの宣言は以下のように行う。

 
__label__ label;

または、

 
__label__ label1, label2, …;

局所ラベルの宣言は、複文式の先頭、つまり、‘({’ の直後で、 他の通常の宣言の前になければならない。

局所ラベルの宣言はラベルを定義するが、ラベル自体を定義するわけでは ない。局所ラベル自体の定義は、通常のラベルと同じく label: を 使って、複文式中で行う必要がある。

局所ラベルの機能は、複文式が使われるのがマクロ定義中であることが多いので、 重宝する。マクロが入れ子になったループを含んでいる場合、 goto を使ってループから脱出することが可能になる。 しかし、通常の、関数内のスコープのラベルはこの目的には使えない。 一個の関数の中でマクロは何度も使われる可能性があり、その場合、 何度もマクロが展開され、同じラベルが一つの関数内で複数回 定義されることになってしまうからである。局所ラベルを使えば、 この問題は回避できる。以下に例を上げる。

 
#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;                                          \
})

This document was generated using texi2html 1.78.