我剛剛開始閱讀關於使用setjmp(jmp_buf)和longjmp(jmp_buf,int)在c中進行異常處理的this article。所以我基本上構建了使用xRecord類型的局部變量並將其鏈接到列表的鏈接列表。 (例2)它工作得很好。但在示例3中,這些步驟彙總爲宏(XTRY和XEND)。什麼最讓我惱火的是,例如2的實際switch語句只是在3, 「消失」帶開啓和關閉標籤的C宏?
例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
}
我的問題是,我如何構建這些「開放和關閉」宏?
沒錯。那麼你的問題是什麼? –
...問題是? – Vlad
呃,不要這樣做。從來沒有發明過改變C文本結構的宏.C中的塊由'{}'給出。從來沒有需要這樣的事情。只需在其周圍放置「{}」即可。 –