有谁能解释一下,在嵌入式编程中,到底在哪里可以使用setjmp()longjmp()个函数?我知道这些是用于错误处理的.但我想知道一些用例.

推荐答案

Error handling
假设嵌套在许多其他函数中的函数内部存在错误,并且错误处理只有在顶级函数中才有意义.

如果中间的所有函数都必须正常返回,并计算返回值或全局错误变量,以确定进一步的处理没有意义,甚至不好,这将是非常繁琐和尴尬的.

在这种情况下,setjmp/longjmp是有意义的.

Coroutines
除了错误处理之外,我还能想到在C中需要setjmp/long jmp的另一种情况:

当你需要实现coroutines的时候就是这样.

这里有一个小的演示示例. 我希望它能满足Sivolrasad Palas对一些示例代码的请求,并回答TheBlastOne的问题setjmp/long jmp如何支持corroutines的实现(就我所见,它并不基于任何非标准或新的行为).

EDIT:

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

jmp_buf bufferA, bufferB;

void routineB(); // forward declaration 

void routineA()
{
    int r ;

    printf("(A1)\n");

    r = setjmp(bufferA);
    if (r == 0) routineB();

    printf("(A2) r=%d\n",r);

    r = setjmp(bufferA);
    if (r == 0) longjmp(bufferB, 20001);

    printf("(A3) r=%d\n",r);

    r = setjmp(bufferA);
    if (r == 0) longjmp(bufferB, 20002);

    printf("(A4) r=%d\n",r);
}

void routineB()
{
    int r;

    printf("(B1)\n");

    r = setjmp(bufferB);
    if (r == 0) longjmp(bufferA, 10001);

    printf("(B2) r=%d\n", r);

    r = setjmp(bufferB);
    if (r == 0) longjmp(bufferA, 10002);

    printf("(B3) r=%d\n", r);

    r = setjmp(bufferB);
    if (r == 0) longjmp(bufferA, 10003);
}


int main(int argc, char **argv) 
{
    routineA();
    return 0;
}

Following figure shows the flow of execution:
flow of execution

Warning note
使用setjmp/long jmp时,请注意它们会影响通常不考虑的局部变量的有效性.
参见我的question about this topic美元.

C++相关问答推荐

两个看似相同的代码的不同行为

新的memaligning函数有什么用?

我可以动态分配具有空类型函数的矩阵吗?

使用额外的公共参数自定义printf

如何使fputs功能提示错误输入并要求用户重新输入.程序停止而不是请求新的输入

在c++中使用堆栈的有效括号

如何将字符**传递给需要常量字符指针的常量数组的函数

进程已完成,退出代码为138 Clion

对重叠字符串使用MemMove

CGO:如何防止在使用CGO在包中包含C头文件时出现多个定义...&q;错误?

使用TCL C API导航到列表中的元素

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

Zlib:解压缩大文件导致";无效代码长度设置";错误

对于STM32微控制器,全局偏移表.get和.Got.plt必须为零初始化

用于计算位数和的递归C函数

为什么我的旧式&q;函数在传递浮点数时会打印2?

如何在C中计算包含递增和递减运算符的逻辑表达式?

'printf("%s", user_input)' 危险吗?

const struct 成员的 typedef 中的灵活数组大小

GDB 用内容初始化数组