zoukankan      html  css  js  c++  java
  • chapter6 非局部跳转函数 setjmp()与longjmp()

    #include <setjmp.h>

      int setjmp(jmp_buf env);

      returns 0 on initial call,nonzero on return via longjmp()

      void longjmp(jmp_env,int val);

    setjmp()函数初次执行的时候返回的是0值,随后的返回值与后续执行的longjmp()函数有了关系,正是longjmp()函数中的val参数

    setjmp()只能在以下语境中使用:

    1.构成选择或者迭代的(if,switch,while)整个控制表达式;

    2.作为!的操作对象,其最终表达式构成了选择或者迭代语句的整个控制表达式。

    3.作为比较操作(==  != < )的一部分,另一操作的对象必须是一个整数常量表达式且其最终表达式构成了选择或者迭代语句的整个控制表达式。

    4.作为独立的函数调用,且没有嵌入到更大的表达式中去。

    !!! 不能写成这样  s=setjmp();  即不能把这个函数的返回值赋值给一个变量。

    head.h

      1 #include <sys/uio.h>
      2 #include <sys/types.h>
      3 #include <sys/stat.h>
      4 #include <unistd.h>
      5 #include <stdlib.h>
      6 #include <stdio.h>
      7 #include <string.h>
      8 #include <fcntl.h>
      9 #include <errno.h>
     10 #include <setjmp.h>
      1 #include "head.h"
      2 
      3 static jmp_buf env;
      4 
      5 static void f2 (void)
      6 {
      7         longjmp(env,2);
      8 }
      9 
     10 static void f1 (int argc)
     11 
     12 {
     13         if(argc==1)
     14                 longjmp(env,1);
     15         f2();
     16 }
     17 
     18 int main (int argc,char *argv[])
     19 {
     20 /*初次调用setjmp值为0 然后根据命令行提供的参数是否为1来决定为1则第二次调用setjmp转到case 1否则转到case2*/
     21 
     22         switch(setjmp(env))
     23         {
     24                 case 0:
     25                 printf("Calling f1() after initial setjmp()
    ");
     26                 f1(argc);
     27                 break;
     28                 case 1:
     29                 printf("We jumped back from f1()
    ");
     30                 break;
     31                 case 2:
     32                 printf("We jumped back from f2()
    ");
     33                 break;
     34         }
     35         return 0;
     36 }
    
        

     其执行结果如下所示:

  • 相关阅读:
    【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
    读取Webpage表中的内容
    各种排序算法的分析及java实现
    运行一个Hadoop Job所需要指定的属性
    Hbase常见异常
    Gora官方文档之二:Gora对Map-Reduce的支持
    Linux 系统挂载数据盘
    Gora快速入门
    Gora官方范例
    在Eclipse中运行Nutch2.3
  • 原文地址:https://www.cnblogs.com/zydark/p/7712413.html
Copyright © 2011-2022 走看看