setjmp(jmp_buf)とlongjmp(jmp_buf、int)を使用したcでの例外処理に関するこの記事を読み始めました。したがって、基本的に、タイプxRecordのローカル変数を使用してリストにリンクするリンクリストを作成します。(例2)問題なく動作します。ただし、例3では、ステップがマクロ(XTRYおよびXEND)に要約されます。私を最も苛立たせているのは、例2の実際のswitchステートメントが3で「消えた」ということです。
例2:
#define DIVIDE_BY_ZERO -3
int SomeFunction(int a, int b)
{
if (b == 0) // can't divide by 0
XRaise(DIVIDE_BY_ZERO);
return a / b;
}
void main(void)
{
XRecord XData;
XLinkExceptionRecord(&XData);
switch (setjmp(XData.Context))
{
case 0: // this is the code block
{
int Result = SomeFunction(7, 0);
// continue working with Result
}
break;
case DIVIDE_BY_ZERO:
printf("a division by zero occurred\n");
break;
default:
printf("some other error occurred\n");
break;
case XFINALLY:
printf("cleaning up\n");
}
XUnLinkExceptionRecord(&XData);
}
例3:
void main(void)
{
XTRY
case XCODE: // this is the code block
{
int Result = SomeFunction(7, 0);
// continue working with Result
}
break;
case DIVIDE_BY_ZERO: // handler for a
specific exception
printf("a division by zero occurred\n");
break;
default: // default handler
printf("some other error occurred\n");
break;
case XFINALLY: // finally handler
printf("cleaning up\n");
XEND
}
私の質問は、これらの「開閉」マクロをどのように構築できるかということです。