我第一次使用setjmp和longjmp,但当我尝试包装它们时,遇到了一个问题。我将代码简化为以下示例:
#include <stdio.h>
#include <setjmp.h>
jmp_buf jb;
int mywrap_save()
{
int i = setjmp(jb);
return i;
}
int mywrap_call()
{
longjmp(jb, 1);
printf("this shouldn't appear\n");
}
void example_wrap()
{
if (mywrap_save() == 0){
printf("wrap: try block\n");
mywrap_call();
} else {
printf("wrap: catch block\n");
}
}
void example_non_wrap()
{
if (setjmp(jb) == 0){
printf("non_wrap: try block\n");
longjmp(jb, 1);
} else {
printf("non_wrap: catch block\n");
}
}
int main()
{
example_wrap();
example_non_wrap();
}
起初我认为example_wrap()和example_non_wrap()的行为是相同的。然而,运行程序的结果(GCC 4.4,Linux)却不同:
wrap: try block
non_wrap: try block
non_wrap: catch block
如果我在gdb中跟踪程序,尽管mywrap_save()返回1,但在返回之后的else分支被奇怪地忽略了。有人能解释一下发生了什么吗?
goto
是更好的错误处理技术。 - jamesdlin