/* * -ansi -pedantic -errors * -O */ #include <stdio.h> #include <setjmp.h> jmp_buf env; int glb_var = 1; void fnc(void) { puts("in fnc(), before longjmp()"); longjmp(env, 1); /* void longjmp(jmp_buf env, int status); */ puts("in fnc(), after longjmp()"); } int main(void) { auto int aut_var = 2; static int sta_var = 3; register int reg_var = 4; volatile int vlt_var = 5; printf("global_var = %d\n", glb_var); printf("auto_var = %d\n", aut_var); printf("static_var = %d\n", sta_var); printf("register_var = %d\n", reg_var); printf("volatile_var = %d\n", vlt_var); if (0 == setjmp(env)) { /* setjmp()是宏 */ puts("first time through"); glb_var += 10; aut_var += 10; sta_var += 10; reg_var += 10; vlt_var += 10; fnc(); } else { puts("back in main"); printf("global_var = %d\n", glb_var); printf("auto_var = %d\n", aut_var); printf("static_var = %d\n", sta_var); printf("register_var = %d\n", reg_var); printf("volatile_var = %d\n", vlt_var); } return 0; }
在非优化时,包括寄存器变量(register修饰)在内的所有类型都被存放在内存中,所以所有变量都是更改后的值。
在优化编译时,自动变量(默认类型)和寄存器变量被存储在寄存器中,其它变量与非优化时一样。所以autoval和regival都还原为原来的值。
附jmp_buf结构:
typedef struct { unsigned j_sp; // 堆栈指针寄存器 unsigned j_ss; // 堆栈段 unsigned j_flag; // 标志寄存器 unsigned j_cs; // 代码段 unsigned j_ip; // 指令指针寄存器 unsigned j_bp; // 基址指针 unsigned j_di; // 目的指针 unsigned j_es; // 附加段 unsigned j_si; // 源变址 unsigned j_ds; // 数据段 } jmp_buf;