我的问题针对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:

恢复局部变量,但同时包含的变量除外
  • 非 Volatile 和
  • 更改了

  • 解释2:

    恢复本地变量,除了
  • 非 Volatile 的和
  • 已更改的那些

  • 根据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/

    10-11 21:05