当调用`longjmp()`时需要'volatile'吗?

时间:2019-02-06 23:22:58

标签: c volatile longjmp setjmp

我正在尝试提供一个最小的工作示例,以显示何时需要volatile。但是下面的示例不需要volatile。有人可以举个例子吗?谢谢。

#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

int main() {
    volatile int local_var = 1;
    int local_var2 = 10;
    if(!setjmp(buf)) {
        local_var = 2;
        local_var2 = 20;
        longjmp(buf, 1);
    } else {
        printf("%d\n", local_var);
        printf("%d\n", local_var2);
    }

    return 0;
}
$ ./main.exe 
2
20

1 个答案:

答案 0 :(得分:1)

只要本地变量可以在对setjmp的建立调用和返回之间更改。

7.13.2.1p3

  

从longjmp开始,所有可访问的对象都有值,抽象机的所有其他组件249都有状态。   调用了函数,除了自动对象的值   存储持续时间对于包含   调用不具有的相应setjmp宏   volatile限定的类型,并且已在setjmp之间进行了更改   调用和longjmp调用是不确定的。

setjmp对您的注册进行快照。如果本地变量在寄存器中,并且您在setjmp调用后更改了该变量,则在跳回时它将具有快照值。

在Linux x86_64上,如果在启用优化的情况下进行编译,则会得到输出2(由于易失,因此是最新的)和10(旧值)。