setjmp (jmp_buf) 및 longjmp (jmp_buf, int)를 사용하여 예외 처리에 대한 this article 읽기를 시작했습니다. 그래서 기본적으로 xRecord 유형의 지역 변수를 사용하는 링크 된 목록을 작성하고이를 목록에 연결합니다. (예 2) 잘 작동합니다. 그러나 예제 3에서는 매크로 (XTRY 및 XEND)로 단계가 요약됩니다.열기 및 닫기 태그가있는 C 매크로입니까?
#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
}
내 질문은 무엇 나를 가장 자극하는 것은 예 2의 실제 switch 문은 단지
3에 예 2 "사라"이다 , 어떻게 이러한 "열리고 닫는"매크로를 만들 수 있습니까? 당신은 두 가지 예를 비교하고, 매크로가 있어야한다 무엇을, C 매크로는 간단한 텍스트 대체 있다는 사실을 유지하는 경우
오른쪽. 그래서 당신의 질문은 무엇입니까? –
... 질문은 무엇입니까? – Vlad
어,하지 마세요. C에서 블록의 텍스트 구조를 변경하는 매크로는 절대로 생성하지 않습니다. C의 블록은'{} '에 의해 제공됩니다. 그런 일은 절대로 필요하지 않습니다. 그 주위에'{}'를 넣으십시오. –