测试 setjmp 和 longjmp 的用法
来源:互联网 发布:python idle打不开 编辑:程序博客网 时间:2024/06/15 18:16
C语言goto是不能跨函数的, 原因: 跨函数需要保存现场, 回来需要恢复现场.
setjmp 和 longjmp 配合, 可以实现在C语言程序中跨函数跳转.
M$给的例子, 对于测试setjmp和longjmp整的复杂了.
我写了一个简单明了的测试程序, 只测试 setjmp和longjmp.
/// @file ClassroomExamples.c/// @brief xxxx-xxxx课堂笔记的验证代码/// 测试 setjmp 和 longjmp 的用法#include <stdlib.h>#include <stdio.h>#include <stddef.h>#include <crtdbg.h>#include <conio.h>#include <setjmp.h>void fnTest1();void fnTest2();jmp_buf g_mark_goto_addr; /* Address for long jump to jump to */int g_jmpret = -2;int main(int argc, char *argv[ ], char *envp[ ]){ do { fnTest1(); fnTest2(); printf("if need quit, press 'q'\r\n"); if ('q' == _getch()) { break; } } while (1); printf("END, press any key to quit\n"); getchar(); return 0;}void fnTest1(){ int jmpret = 0; printf(">> fnTest1()\n"); if (0 != g_jmpret) { // setjmp 和 longjmp 配合使用一次后, 就失效了 // 需要重新执行setjmp, 然后才能重新longjmp // 暂时还没想到实际引用longjmp的场景 // 以后看看longjmp在实际场景中怎么用 g_jmpret = setjmp(g_mark_goto_addr); if (-1 != g_jmpret) { printf("env save ok\r\n"); } } printf("<< fnTest1()\n");}void fnTest2(){ int iKeyIn = 0; printf(">> fnTest2()\n"); printf("if want longjmp to fnTest1, press y:"); iKeyIn = _getch(); if ('y' == iKeyIn) { if (-1 != g_jmpret) { printf("longjmp to fnTest1 ^_^\n"); /* Restore calling environment and jump back to setjmp. Return * -1 so that setjmp will return false for conditional test. */ longjmp(g_mark_goto_addr, -1); } } printf("<< fnTest2()\n");}
0 0
- 测试 setjmp 和 longjmp 的用法
- setjmp和longjmp的用法
- setjmp和longjmp的用法
- setjmp和longjmp的用法
- setjmp和longjmp的使用
- setjmp和longjmp的使用
- setjmp和longjmp的使用
- setjmp和longjmp的使用
- setjmp和longjmp 的理解
- C中的信号处理和函数setjmp()/longjmp()的用法
- C 中的 setjmp 和 longjmp 用法
- C中setjmp和longjmp用法
- setjmp, longjmp用法简介
- longjmp setjmp 简单用法
- c语言的setjmp和longjmp
- Linux下的setjmp和longjmp
- setjmp和longjmp的"非本地跳转"
- 关于setjmp和longjmp的使用
- 推荐一款编程字体,让代码看着更美
- 爱情十问
- html文件查看器
- 独立日记 2015年12月27日 day6
- POJ--3321 Apple Tree(树状数组+dfs(序列))
- 测试 setjmp 和 longjmp 的用法
- 工厂方法模式
- js中关于导航切换效果-之一(鼠标移动)
- 设计模式开篇
- Spring(二)--Bean装配
- PHP 自 5.2 到 5.6 中新增的功能详解
- c语言16进制输出
- 如何让div中的table居中
- html文件查看器2