我正在尝试提供一个最小的工作示例,以显示何时需要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
答案 0 :(得分:1)
只要本地变量可以在对setjmp
的建立调用和返回之间更改。
从longjmp开始,所有可访问的对象都有值,抽象机的所有其他组件249都有状态。 调用了函数,除了自动对象的值 存储持续时间对于包含 调用不具有的相应setjmp宏 volatile限定的类型,并且已在setjmp之间进行了更改 调用和longjmp调用是不确定的。
setjmp
对您的注册进行快照。如果本地变量在寄存器中,并且您在setjmp
调用后更改了该变量,则在跳回时它将具有快照值。
在Linux x86_64上,如果在启用优化的情况下进行编译,则会得到输出2
(由于易失,因此是最新的)和10
(旧值)。