我的问题针对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()调用之间是不确定的。”
我看到以下两种可能的解释:
解释1:
恢复局部变量,但同时包含的变量除外
解释2:
恢复本地变量,除了
根据longjmp之后的解释1,仅v1是未定义的。定义了v2,v3,v4。
根据解释2,longjmp之后仅定义了v4。 v1,v2,v3未定义。
哪一个是对的?
顺便说一句:我需要一个对所有编译器都有效的通用(“便携式”)答案,即尝试使用一个特定的编译器没有帮助。
最佳答案
解释1是正确的。如果要使用解释2,则原始文本将使用“或已更改”而不是“and”。
关于c - setjmp/longjmp和局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1393443/