环境:Debian 6.
code, from apue:
/***************************************************************************************************** * File name: setjmp.cpp * Create time: 2011/06/17 * Module: View * Author: zengqh * Blog: http://blog.csdn.net/aimyton * --------------------------------------------------------------------------------------------------- * Memo: * *****************************************************************************************************/ #include "apue.h" #include <setjmp.h> /***************************************************************************************************** * Macro and Struct definition *****************************************************************************************************/ /***************************************************************************************************** * Global variables *****************************************************************************************************/ static jmp_buf jmpbuffer; static int g_val; /***************************************************************************************************** * Global function declare *****************************************************************************************************/ static void f1(int, int, int, int); static void f2(); /***************************************************************************************************** * Global function definition *****************************************************************************************************/ int main() { int auto_val; register int reg_val; volatile int vol_val; static int sta_val; g_val = 1; auto_val = 2; reg_val = 3; vol_val = 4; sta_val = 5; if(0 != setjmp(jmpbuffer)) { printf("after longjmp:/n"); printf("g_val = %d, auto_val = %d, reg_val = %d, vol_val = %d," "stat_val = %d/n", g_val, auto_val, reg_val, vol_val, sta_val); exit(0); } /* change the value */ g_val = 95; auto_val = 96; reg_val = 97; vol_val = 98; sta_val = 99; f1(auto_val, reg_val, vol_val, sta_val); exit(0); } static void f1(int i, int j, int k, int l) { printf("inside f1:/n"); printf("g_val = %d, auto_val = %d, reg_val = %d, vol_val = %d," "stat_val = %d/n", g_val, i, j, k, l); f2(); } static void f2() { longjmp(jmpbuffer, 1); } /***************************************************************************************************** * Class declare ******************************************************************************************************/ /***************************************************************************************************** * Class definition *****************************************************************************************************/ /***********************************End of File*******************************************************/
以DEBUG模式编译:
PROJECT(setjmp) SET(CMAKE_BUILD_TYPE "Debug") ADD_EXECUTABLE(setjmp setjmp.cpp)
result:
g_val = 95, auto_val = 96, reg_val = 97, vol_val = 98,stat_val = 99 after longjmp: g_val = 95, auto_val = 96, reg_val = 97, vol_val = 98,stat_val = 99
以Release模式编译:
PROJECT(setjmp) SET(CMAKE_BUILD_TYPE "Release") ADD_EXECUTABLE(setjmp setjmp.cpp)
g_val = 95, auto_val = 96, reg_val = 97, vol_val = 98,stat_val = 99 after longjmp: g_val = 95, auto_val = 2, reg_val = 3, vol_val = 98,stat_val = 99
可以看到自动变量与寄存器变量没有更新,全局,静态,volatile更新了!!!