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

4.3 ラベルの値

関数内で定義されたラベルのアドレスは、同じ関数内であれば、 単項演算子 ‘&&’ を使って取得することが出来る。 ラベルのアドレス値の型は void * になる。ラベルのアドレス値は、 定数であり、この型の定数が有効なところならどこでも使うことが出来る。 例を挙げよう。

 
void *ptr;
…
ptr = &&foo;

ラベルのアドレス値を使うためには、そのラベルをジャンプすることが出来なければ ならない。このためには、計算形 goto 文 (1)goto *exp; を使う。例えば以下のようにする。

 
goto *ptr;

void * 型であれば、任意の式を使うことが出来る。

これらの定数の使い道の一つは、ジャンプテーブルの静的配列を 初期化することである。

 
static void *array[] = { &&foo, &&bar, &&hack };

こうすれば、以下のように、添え字でラベルを選ぶことが出来る。

 
goto *array[i];

添字の範囲についての検査は行なわないことに注意すること。 C 言語では、配列の参照においては添字の範囲の検査は行ない。

この様なラベル値の配列は、switch 文と同様の機能を提供する。 もちろん、switch 文を使ったほうがきれいなので、 対象とする問題が switch 文にうまく当てはまらない場合以外は、 switch 文を使うべきである。

もうひとつの、ラベル値の使い道は、スレッドを使ったコードのインタプリタ にある。インタプリタ関数内のラベルは、超高速ディスパッチ用の素レッドコード に格納することができる。

この機構を使って、異なる関数中のコードにジャンプすることができる。 それをやると、全く予測できない事が発生するだろう。 これを避けるのに一番良い方法は、ラベルのアドレスを自動変数にだけ格納し、 引数としては渡さないことである。


This document was generated using texi2html 1.78.