| [ < ] | [ > ] | [ << ] | [ 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.