[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
関数内で定義されたラベルのアドレスは、同じ関数内であれば、
単項演算子 ‘&&’ を使って取得することが出来る。
ラベルのアドレス値の型は 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.