このマクロの目的
setjmp
マクロは、 longjmp()
によってジャンプする場所を指定する。
定義
#include <setjmp.h> int setjmp(jmp_buf env);
働き
これは関数ではなく、マクロとして定義されてもよい。
すなわち、 setjmp(buf[j++])
のように副作用のある呼び出しは問題がある。
実行される場所の情報を env にセットし、 0 を返す。
longjmp
関数によるジャンプでは、 0 以外の値を返す。
setjmp
マクロは以下の位置にしか置くことはできない。
if
、 switch
、 while
、 for
の条件文全体。
!
のオペランド。結果は条件文全体である必要がある。
解説
これに従うなら、以下のような使い方しかできない。
switch(setjmp(env)); if(0 == setjmp(env)); if(!setjmp(env)); setjmp(env);
つまり result = setjmp(env);
のような変数への代入はできないのだ。きつい!
しかし、実際問題として代入文を書いて問題が発生することはまずないだろう。
ANSI C 委員会のメンバーが書いた規格の解説書にも、しっかり代入してあるサンプルが載っている。