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 }
    
        

     其执行结果如下所示:

  • 相关阅读:
    113.dynamic_cast 虚函数 通过子类初始化的父类转化为子类类型
    112.虚函数强化
    111.final与override
    110.纯虚函数
    109.虚函数与析构构造
    custom-ubuntu-server-iso
    定制ubuntu的时候修改proseed
    centos使用U盘做启动盘
    fio的配置使用
    持续运行一个命令-并且将结果输出到文本
  • 原文地址:https://www.cnblogs.com/zydark/p/7712413.html
Copyright © 2011-2022 走看看