我的问题是针对setjmp/longjmp关于局部变量的行为。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()的函数的本地,它没有volatile限定类型,并且在setjmp()调用和longjmp()调用之间发生更改 不确定。
我看到以下两种可能的解释:
intepretation1:
局部变量被恢复,除了那些既
- 非易失性和
- 改变
intepretation2:
个局部变量被恢复,除了
- 那些非易失性和
- 那些改变
根据interpretation1后的longjmp只有V1是未定义的。 v2,v3,v4被定义。 根据longjmp之后的解释2,只定义了v4。 v1,v2,v3未定义。
哪一个是正确的?
顺便说一句:我需要一个适用于所有编译器的通用(“便携式”)答案,即尝试使用一个特定的编译器没有帮助。
实现注意:变量和非易失性的变量可能与longjmp时相同,或者可能会恢复到setjmp时的值,具体取决于代码生成。因此'不确定'。所以,如果他们不*改变,这两个值是相同的,这就是为什么不变的变量是安全的。 – greggo 2012-04-13 21:27:11