제 질문은 로컬 변수에 관한 setjmp/longjmp의 동작을 목표로합니다.setjmp/longjmp 및 로컬 변수
는예제 코드 : setjmp는의
jmp_buf env;
void abc()
{
int error;
...
if(error)
longjmp(env);
}
void xyz() {
int v1; // non-volatile; changed between setjmp and longjmp
int v2; // non-volatile; not changed between setjmp and longjmp
volatile int v3; // volatile; changed between setjmp and longjmp
volatile int v4; // volatile; not changed between setjmp and longjmp
...
if(setjmp(env)) {
// error handling
...
return;
}
v1++; // change v1
v3++; // change v3
abc();
}
int main(...) {
xyz();
}
문서는/longjmp를 말한다 :
"모든 접근 객체(), 호출 된 시간 longjmp를 기준으로 값이 개체의 값 것을 제외하고 이 volatile 지정 유형이없고 setjmp() 호출과 longjmp() 호출 사이에 이 변경된 해당 setjmp() 호출을 포함하는 함수에 로컬 인 자동 저장 기간은 불확정합니다. "
나는 두 가지 해석은 다음을 참조하십시오
intepretation1 :
지역 변수가 모두
- 비 휘발성 및
- 는
침입 2 :
개로컬 변수
- 제외 복원 비 휘발성이며
- longjmp를 V1 만이 정의 된 후 interpretation1 따르면
변경되는 이러한 것들. v2, v3, v4가 정의됩니다. longjmp 이후의 해석 2에 따르면 v4 만 정의됩니다. v1, v2, v3은 정의되지 않습니다.
어느 것이 옳은가요?
BTW : 모든 컴파일러에 유효한 일반 ("휴대용") 대답이 필요합니다. 즉, 특정 컴파일러로 시도해도 도움이되지 않습니다.
구현 참고 사항 : 변경되거나 비 휘발성 인 변수는 longjmp와 동일하거나 코드 생성에 따라 setjmp 당시의 상태로 복원 될 수 있습니다. 따라서 '불확정'. 그래서, 만약 그들이 * 변경되지 않았다면,이 두 값은 동일하고 따라서 변경되지 않은 변수는 안전합니다. – greggo