C 标准库 setjmp.h

setjmp.h 是 C 语言标准库中的一个头文件,提供了一种跳转控制流的机制。setjmp.h 库中包含了两个函数:setjmp 和 longjmp。这两个函数分别用于保存程序的当前环境(内存状态)和基于后已保存的状态跳回。下面我们详细讲解 setjmp.h 的使用攻略。

setjmp 函数

setjmp 函数的原型如下:

#include <setjmp.h>

int setjmp(jmp_buf env);

setjmp 函数用于保存程序的当前环境,将当前环境保存在 jmp_buf 这个类型的变量 env 中。当程序调用 longjmp 函数时,env 将在特定的那个地方重启执行。

setjmp 函数返回两个值:0 或非0 值。如果 setjmp 返回0,表示当前调用是函数的在程序的顶层处(main 函数)。如果setjmp返回非0值,则表示当前调用的函数是跳回来的(通过 longjmp 函数),并且值是由 longjmp 函数提供的。

下面是一个示例代码:

#include <stdio.h>
#include <setjmp.h>

#define MAX_LOOP_CNT 3

jmp_buf g_JumpBuffer;

int main()
{
    int loopCnt = 0;
    int jmpRet = setjmp(g_JumpBuffer);

    if (jmpRet != 0)
    {
        printf("Jumped back using longjmp: %d\n", jmpRet);
    }
    else
    {
        printf("Jump is initial, start counting\n");
    }

    while (loopCnt < MAX_LOOP_CNT)
    {
        printf("Counter: %d\n", loopCnt);
        ++loopCnt;
        if (loopCnt == 2)
        {
            printf("Encounter longjmp, jump back to beginning\n");
            longjmp(g_JumpBuffer, 100);
        }
    }

    printf("Program ended, exit...\n");
    return 0;
}

输出如下:

Jump is initial, start counting
Counter: 0
Counter: 1
Encounter longjmp, jump back to beginning
Jumped back using longjmp: 100

在这个例子中,我们首先定义了一个名为 g_JumpBuffer 的 jmp_buf 类型的变量,然后进入一个 while 循环,当计数器 loopCnt = 2 时,我们调用了 longjmp 函数。此时程序跳回至 setjmp 函数调用的位置,并将值 100 传递给setjmp函数(这个值自行设定)。当回到setjmp函数时,setjmp 将返回 100。

longjmp 函数

longjmp 函数可以让我们从当前运行的代码转移到 setjmp 所保存的地方。它的原型如下:

#include <setjmp.h>

void longjmp(jmp_buf env, int val);

其中,env 参数是 setjmp 函数保存的 jmp_buf 数据类型变量。val 是 longjmp 函数返回的值,如果没有特殊要求可以设为 0。

下面是一个示例代码:

#include <stdio.h>
#include <setjmp.h>

jmp_buf g_JumpBuffer;

void FunctionTwo()
{
    printf("Enter function two\n");
    longjmp(g_JumpBuffer, 2);
}

void FunctionOne()
{
    int retJmp = setjmp(g_JumpBuffer);
    printf("Jump returned value: %d\n", retJmp);
    if (retJmp == 0)
    {
        printf("Enter function one\n");
        FunctionTwo();
    }
    else if (retJmp == 1)
    {
        printf("Function one: jump back by 1\n");
    }
    else if (retJmp == 2)
    {
        printf("Function one: jump back by 2\n");
    }
}

int main()
{
    printf("Start setjmp/longjmp...\n");
    FunctionOne();
    return 0;
}

输出如下:

Start setjmp/longjmp...
Jump returned value: 0
Enter function one
Enter function two
Jump returned value: 2
Function one: jump back by 2

在这个例子中,我们定义了两个函数 FunctionOne 和 FunctionTwo,分别通过 setjmp 和 longjmp 函数实现跳转控制流。程序首先从主函数开始,调用了 FunctionOne 函数。FunctionOne 函数调用了 setjmp 函数,将环境保存在 jmp_buf 类型变量 g_JumpBuffer 中。接着 FunctionOne 函数调用了 FunctionTwo 函数,执行到 longjmp 函数时,跳转回 setjmp函数所在的位置,并将返回值2传给 setjmp 函数。当 setjmp函数接收到返回值 2 时,跳过该函数的执行,开始执行后续的代码。而后续的代码中,则会输出“Function one: jump back by 2”。

注:setjmp/longjmp 的使用有许多限制和约束条件,建议在使用前仔细阅读 setjmp.h 的文档和说明。同时,在日常开发中,应尽量避免使用 setjmp/longjmp,以确保代码的可读性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 标准库 setjmp.h - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • C语言用函数指针实现一个特别的计算器

    C语言用函数指针实现一个特别的计算器 1. 什么是函数指针 在C语言中,函数指针是指向函数的指针变量,也就是说,函数指针存储的是一个函数的地址。通过函数指针,我们可以直接调用该函数,就像调用普通变量一样,这样可以使程序更加灵活。 定义一个函数指针需要注意两点:- 函数指针的声明方式与普通指针有所不同,其声明格式为 返回类型 (*指针变量名)(参数列表);- …

    C 2023年5月23日
    00
  • 菜鸟记录:c语言实现PAT甲级1003–Emergency

      久违的PAT,由于考研408数据结构中有一定需要,同时也是对先前所遗留的竞赛遗憾进行一定弥补 ,再次继续PAT甲级1003.。 As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several s…

    C语言 2023年4月17日
    00
  • C语言中设置进程优先顺序的方法

    要设置C语言中进程的优先顺序,可以使用系统调用函数setpriority,该函数需要传入下面三个参数: who:指示设置优先级的进程类型。它可以是 PRIO_PROCESS 表示以PID的形式指定要被调度的进程;也可以是 PRIO_PGRP 表示以进程组ID的形式指定被调度的进程。最后,还可以是 PRIO_USER 表示以用户ID的形式指定进程。 id:进程…

    C 2023年5月23日
    00
  • C++德州扑克的核心规则算法

    C++德州扑克的核心规则算法 C++德州扑克的核心规则算法主要包括底牌牌型的判断、公共牌牌型的判断、牌的大小比较等,下面将具体介绍这些算法的实现方法。 底牌牌型的判断 底牌牌型的判断是德州扑克中最基本的规则之一,其判断方法如下: 先根据底牌的花色和点数进行分类,将相同花色的牌和相同点数的牌分开。 判断是否存在对子、三条、四条等牌型,如果存在,则底牌的牌型为该…

    C 2023年5月23日
    00
  • C语言实现航班管理系统

    C语言实现航班管理系统 简介 航班管理系统是一个能够记录航班信息并对其进行管理的软件程序。它可以记录航班的基本信息,如航班号、起飞地、目的地、起飞时间、到达时间、机型等,并提供相应的查询、修改、删除等功能。在本篇文章中,我们将使用C语言创建一个简单的航班管理系统。 步骤 步骤1: 创建一个结构体来保存航班信息 首先,我们需要创建一个结构体来存储航班信息。每一…

    C 2023年5月22日
    00
  • C语言实现的猴子分桃问题算法解决方案

    C语言实现的猴子分桃问题算法解决方案 问题描述 有5只猴子分一堆桃子,第一只猴子把桃子分成五份,多了一个,他把多的一个丢了,拿走了一份桃子。第二只猴子把剩下的桃子又分成五份,又多了一个,他也把多的一个丢了,拿走了一份桃子。第三只、第四只猴子都是这样干的,问最后一只猴子分完后还剩几个桃子? 解题思路 这是一道数学问题,可以通过逆推法推断出最初的桃子数。设第n个…

    C 2023年5月22日
    00
  • C/C++ extern关键字用法示例全面解析

    当在 C/C++ 中需要引用其他源文件中定义的变量或函数时,可以使用 extern 关键字。extern 关键字用于将某个全局变量或函数声明为外部定义,以便在该程序中的其他文件中使用。 下面通过几个示例来详细介绍 extern 关键字的用法。 示例一:在不同文件中使用全局变量 假设我们有以下两个 C 文件: source1.c #include <st…

    C 2023年5月23日
    00
  • C语言利用cJSON解析JSON格式全过程

    当我们需要获取某个Web API的数据时,一般情况下会返回JSON格式的数据。如何使用C语言来解析这些JSON数据呢?这时候,就可以使用cJSON开源库。 cJSON是一款轻量级、快速的C语言JSON解析器。它使用简单,只需要包含一个头文件”cJSON.h”,并将相关代码文件加入到项目中即可。下面将详细讲解cJSON解析JSON格式的全过程。 第一步:安装c…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部