谁能解释我在嵌入式编程中实际上可以使用setjmp()
和longjmp()
函数的确切位置吗?我知道这些用于错误处理。但是我想知道一些用例。
最佳答案
处理时出错
假设嵌套在许多其他函数中的函数中存在一个深入的错误,并且错误处理仅在顶级函数中才有意义。
如果介于两者之间的所有函数必须正常返回并评估返回值或全局错误变量,以确定进一步的处理没有意义甚至是不好的,那将是非常繁琐和尴尬的。
在这种情况下,setjmp / longjmp有意义。
这些情况类似于其他语言(C++,Java)中的异常(exception)有意义的情况。
协程
除了错误处理,我还可以想到另一种需要在C中使用setjmp / longjmp的情况:
需要实现coroutines时就是这种情况。
这是一个演示示例。
我希望它能够满足Sivaprasad Palas对某些示例代码的请求,并回答TheBlastOne的问题setjmp / longjmp如何支持例程的实现(就我所知,它不基于任何非标准或新的行为)。
编辑:
在调用堆栈中执行longjmp
可能实际上是未定义的行为(请参阅MikeMB的评论;尽管我还没有机会进行验证)。
#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;
}
下图显示了执行流程:
警告说明
使用setjmp / longjmp时,请注意它们会影响通常不考虑的局部变量的有效性。
cf.我的question about this topic。
关于c - setjmp和longjmp在C中的实际用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14685406/