[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
局所ラベルは、複文式のスコープで宣言することができる。
局所ラベルは単なる識別子である。
普通の 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.