programming2017.04.07 11:37

재미 있는 API를 발견해서 공유 합니다. 재미로 보시면 될거 같아요 ~

국내 에서는 GOTO 문을 사용하면 범죄자 최급을 받는게 보통 이지만 외국 소스를 보면 GOTO 문이 종종 보이긴 합니다.

 

% 주로 긴 함수 내에서 사용하며 해당 함수를 종료할때 꼭 수행 되야 하는 코드들이 있는 경우를 종종 봅니다.

보통 GOTO 문은 함수 내에서 사용 합니다. (그래서 local goto 로 불리는거 같아요~)

 

소개 하려는 API 는 nolocal goto 라고 불립니다. 명칭을 보면 감이 오겠지만 함수 외에서도 이용이 가능한 놈인거 같습니다.

 

소스보기

 

해당 로직에서 우리가 기대 하는 flow 는 1->2->3->4 순으로 실행 되며 console 에는 start, end 가 출력 되는걸 기대합니다.

 

% setjmp API 는 함수가 실패 하지 않으면 0 을 리턴 합니다.

 

하지만, 해당 소스를 실행하면 console 에 출력되는 결과는 start, First Error, end 입니다.

아래와 같은 순서의 flow 로 진행 되기 때문입니다.

 

소스보기

 

1 에서 현재 위치 정보를 설정 합니다.

2-1 에서 다시 setjmp 로 돌려 보냅니다. 그리고 리턴값도 지정해 줍니다. goto~

3 에서 setjmp 는 2-1 에서 지정된 FIRST_ERROR 을 리턴 합니다.

이후 4->5 순으로 수행 됩니다.

 

% 스텍 메모리에서 해제된 함수내의 setjmp 로는 goto 하지 못합니다. (이미 스택에서 제거된 함수 이므로~)

% setjmp - longjmp 사이에 변경된 메모리 값은 원상 복구 하지 않습니다. (순순이 goto 만 합니다.)

Posted by 상현달