재미 있는 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 만 합니다.)
'programming' 카테고리의 다른 글
C++ 개발자를 위한 C# 키워드 정리 (0) | 2015.03.20 |
---|---|
힙이 손상 되는 오류 노가다로 찾아 내기 (0) | 2014.01.28 |
GetLastError 함수 코드와 한글 메시지 (0) | 2013.08.26 |
ODBC 관리자는 32bit 64bit 호환 되지 않는다 (2) | 2012.09.14 |
stack overflow 되면 mini dump 0kb 인 문제 해결 방법 (0) | 2012.04.16 |