C언에서 loop가 중첩되는 경우 일반적으로 break를 여러번 사용해야 합니다.
하지만 다른 방법도 있긴 한데 setjmp를 이용하는 방법입니다.
아래 예제를 보면 이해가 쉬울 수 있는데,
원리는 setjmp로 마킹했는 지점의 stack을 저장해두었다가 복원 하는 방식입니다.
따라서 호출되는 위치는 자신이 거처온 지점중에 하나가 되게 됩니다.
longjmp시 뒤에 인자는 setjmp의 인자값으로 가지고 돌아갑니다.
하지만 이러한 방법은 거의 사용되는 경우를 보지 못했습니다.
이런게 있다는 정도만 기억하면 될 것 같습니다.
C, pasted just now:
|
#include <stdio.h>
#include <setjmp.h>
jmp_buf savejmp;
int a;
int loop()
{
for(;;){
for(;;){
for(;;){
a++;
if( a==100 )
longjmp(savejmp, 1);
}
}
}
}
int main()
{
// setjmp 최초 실행시 0을 반환, longjmp 에서 호출될때 두번째 인자값 반환
if( setjmp(savejmp)==0 ){
// 최초 실행
printf("Hello world\n");
loop();
// 리턴안됨 여기로 오면 무한루프
printf("endless\n");
for(;;);
}else{
printf("end %d\n",a);
}
return 0;
}
|
Output:
|
댓글 없음:
댓글 쓰기