21 Oct
2011
Posted in: 코드
By    2 Comments

setjmp/longjmp, 2002


setjmp/longjmp, 2002
by 신영진(YoungJin Shin), codewiz at gmail.com, @codemaru, http://www.jiniya.net

C언어를 가끔 사용하다 보면 이런 것들을 하고 싶을때가 있습니다. 이 함수를 넘어 저 함수로 이동하거나 함수의 경계를 넘나드는 어떤 처리를 하고 싶을때가 있죠. 처음 딱 생각하기에는 goto로 될 것 같지만, C언어의 goto에는 함수의 범위를 넘지 못하는 제약이 있습니다. 대신 목적을 위해 만들어진 함수 두개가 있습니다. 바로 setjmp, longjmp입니다. 이름 그대로 아주 먼 거리를 점프하는 함수죠. 그럼 실제 소스 코드를 볼까요??

#include 
#include 

jmp_buf pos; 

void proc() 
{ 
   static int i = 0; 

   ++i;
   if(i<10) 
       longjmp(pos, i); 

   return; 
} 

int main() 
{ 
   int a; 

   a = setjmp(pos); 
   printf("%d\n", a); 
   proc(); 
   return 0; 
}

결과는 각자 감상하시면서 한번씩 생각해 보시길 바랍니다. 참고로 jmp_buf는 상태를 저장하는 버퍼 구조체 입니다. 기본 원리는 setjmp는 현재 상태를 저장하고 longjmp이전 상태로 이동하는 역할을 하게 됩니다. 각자 한번 실행해 보시면 금방 아! 하시게 될겁니다.

그럼 다들 좋은 하루 되세요.

Browser does not supports flash movie

  • 트랙백 주소: http://www.jiniya.net/wp/archives/5030/trackback

관련 글

  • akdrp

    오… 잘 쓰면 유용하겠네요. 감사합니다.

  • codewiz

    akdrp // C++에서는 호환이 되지 않기 때문에 거의 사용되지 않는 기능입니다. try, catch를 사용하시는 것이 좋습니다.