arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
setjmp()
setjmp()

このマクロの目的

setjmp マクロは、 longjmp() によってジャンプする場所を指定する。

定義

	#include <setjmp.h>
	int setjmp(jmp_buf env);

働き

これは関数ではなく、マクロとして定義されてもよい。 すなわち、 setjmp(buf[j++]) のように副作用のある呼び出しは問題がある。

実行される場所の情報を env にセットし、 0 を返す。 longjmp 関数によるジャンプでは、 0 以外の値を返す。

setjmp マクロは以下の位置にしか置くことはできない。

  • ifswitchwhilefor の条件文全体。
  • オペランドの一方が整数定数の比較演算子の、もう一方のオペランド。比較の結果は条件文全体である必要がある。
  • 単項演算子 ! のオペランド。結果は条件文全体である必要がある。
  • 文全体。

解説

これに従うなら、以下のような使い方しかできない。

switch(setjmp(env));
if(0 == setjmp(env));
if(!setjmp(env));
setjmp(env);

つまり result = setjmp(env); のような変数への代入はできないのだ。きつい! しかし、実際問題として代入文を書いて問題が発生することはまずないだろう。 ANSI C 委員会のメンバーが書いた規格の解説書にも、しっかり代入してあるサンプルが載っている。

arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
KC