我的问题涉及到setjmp/longjmp在处理局部变量时的行为。
示例代码:
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();
}
setjmp/longjmp的文档中写道:
"除了被调用longjmp()函数之前,由包含调用相应setjmp()的函数本地声明且没有易失性限定符类型以及在setjmp()调用和longjmp()调用之间发生更改的自动存储持续期对象的值不确定之外,所有可访问的对象都具有longjmp()调用时的值。"
我看到以下两种可能的解释:
解释1:
本地变量被还原,除非它们同时满足以下两个条件:
- 非易失性,且
- 已经更改
解释2:
本地变量被还原,除了:
- 非易失性的变量,以及
- 已经更改的变量
根据解释1,在longjmp之后只有v1是未定义的。v2、v3、v4是定义的。 根据解释2,在longjmp之后只有v4是定义的。v1、v2、v3是未定义的。
哪一个是正确的?
顺便说一下:我需要一个通用(“可移植”)答案,适用于所有编译器,即尝试使用特定编译器并没有帮助。