Я впервые использую setjmp и longjmp и столкнулся с проблемой, возникающей при переносе 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 после возврата выглядит странным образом.игнорируются.Кто-нибудь может объяснить, что происходит?