gpt4 book ai didi

c - C 中的异常处理 - setjmp() 返回 0 有什么用?

转载 作者:太空狗 更新时间:2023-10-29 17:15:30 25 4
gpt4 key购买 nike

我有几个关于 setjmp/longjmp 用法的问题 -

  1. setjmp(jmp___buf stackVariables) 返回 0 有什么用。这是默认值,我们无法影响。

  2. setjmp(stackVariables)的唯一意义就是把栈压入stackVariables。基本上 0 告诉我们堆栈是否已成功推送到 stack_variables。

  3. 有一次当您从 longjmp 返回时值不为零(任何非零)。什么时候从 lomgjmp 返回,什么时候从 longjmp 返回,什么时候处理异常。这是设置真的很困惑。

  4. 有人可以将它与 try/throw and catch 联系起来吗?如果能提供一些 setjmp/longjmp 的好例子,那就太好了。

  5. longJmp 是否类似于 throw,它在可以引发异常的地方之后被调用。

谢谢。

最佳答案

C99 规范给出:

If the return is from a direct invocation, the setjmp macro returns the value zero. If the return is from a call to the longjmp function, the setjmp macro returns a nonzero value.

所以 1 的答案是零表示您第一次调用了 setjmp,非零表示它是从 longjmp 返回。

  1. 它推送当前程序状态。经过 longjmp 后,状态恢复,控制返回到调用点,返回值非零。

  2. C 中没有异常(exception)。它有点类似于 fork 返回不同的值,具体取决于您是在原始进程中,还是在继承环境的第二个进程中,如果你熟悉的话。

  3. C++ 中的
  4. try/catch 将在 throw 和 catch 之间调用所有自动对象的析构函数。 setjmp/longjmp 将不会调用析构函数,因为它们在 C 中不存在。所以你只能靠自己调用 free您同时malloc的任何内容。

有了这个条件,这个:

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

void foo ( char** data ) ;
void handle ( char* data ) ;
jmp_buf env;

int main ()
{
char* data = 0;

int res = setjmp ( env );
// stored for demo purposes.
// in portable code do not store
// the result, but test it directly.

printf ( "setjmp returned %d\n", res );

if ( res == 0 )
foo ( &data );
else
handle ( data );

return 0;
}


void foo ( char** data )
{
*data = malloc ( 32 );

printf ( "in foo\n" );

strcpy ( *data, "Hello World" );

printf ( "data = %s\n", *data );

longjmp ( env, 42 );
}

void handle ( char* data )
{
printf ( "in handler\n" );

if ( data ) {
free ( data );
printf ( "data freed\n" );
}
}

大致相当于

#include <iostream>

void foo ( ) ;
void handle ( ) ;

int main ()
{
try {
foo ();
} catch (int x) {
std::cout << "caught " << x << "\n";
handle ();
}

return 0;
}

void foo ( )
{
printf ( "in foo\n" );

std::string data = "Hello World";

std::cout << "data = " << data << "\n";

throw 42;
}

void handle ( )
{
std::cout << "in handler\n";
}

在 C 的情况下,你必须进行显式内存管理(尽管通常你会在调用 longjmp 之前在 malloc 的函数中释放它,因为它使生活更简单)

关于c - C 中的异常处理 - setjmp() 返回 0 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1692814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com