
このマクロの目的
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 委員会のメンバーが書いた規格の解説書にも、しっかり代入してあるサンプルが載っている。