在C+中使用setjmp()和longjmp()是否有一种安全的方法+;? 我印象中,在C++中使用 SETJMP()/和LangJMP()/Case>几乎保证了堆栈的混乱,因为这些函数不执行解开,比如例外。但是,表示可以告诉Microsoft实现调用本地对象的析构函数,这意味着谨慎使用这些函数是安全的 < >在C++中使用 SETJMP()/和 LojJMP()/时,是否有一种可移植的方法来确保程序的正确性?C++中的最佳实践表明,异常最好不用于流控制,但在需要非常不寻常的流的情况下(例如,协同程序和闭包),使用异常来代替这些函数是否总是更可取?

在C+中使用setjmp()和longjmp()是否有一种安全的方法+;? 我印象中,在C++中使用 SETJMP()/和LangJMP()/Case>几乎保证了堆栈的混乱,因为这些函数不执行解开,比如例外。但是,表示可以告诉Microsoft实现调用本地对象的析构函数,这意味着谨慎使用这些函数是安全的 < >在C++中使用 SETJMP()/和 LojJMP()/时,是否有一种可移植的方法来确保程序的正确性?C++中的最佳实践表明,异常最好不用于流控制,但在需要非常不寻常的流的情况下(例如,协同程序和闭包),使用异常来代替这些函数是否总是更可取?,c++,exception,coroutine,C++,Exception,Coroutine,如果您有一些非常奇怪的要求,不允许您使用条件/循环/中断来正常控制程序流,我宁愿使用异常而不是jmp 在某些情况下,使用异常控制流是可以接受的。我认为Boost.Graph的一个搜索函数抛出了一个异常,以便从深度递归快速返回调用方。我以前使用过它们,但只有一种情况:我在为OS类用C创建OS内核;它们用于异常处理 我的理解是,在处理低级代码(如操作系统)时,它们用于异常处理。对于一般的C++软件,我只使用尝试 >代码> catch < /c> > /p>为协同程序,参见[如何在C++中实现Coro

如果您有一些非常奇怪的要求,不允许您使用条件/循环/中断来正常控制程序流,我宁愿使用异常而不是jmp


在某些情况下,使用异常控制流是可以接受的。我认为Boost.Graph的一个搜索函数抛出了一个异常,以便从深度递归快速返回调用方。

我以前使用过它们,但只有一种情况:我在为OS类用C创建OS内核;它们用于异常处理


我的理解是,在处理低级代码(如操作系统)时,它们用于异常处理。对于一般的C++软件,我只使用<代码>尝试<代码> >代码> catch < /c> > /p>为协同程序,参见[如何在C++中实现Coroutines ](“在需要非常不寻常的流的情况下”,问如何实现那个特殊的异常工作流是更好的。抽象的问题很少有有用的答案。@Dummy00001:我通过提供不寻常的控件构造示例,而不是试图暗示我正在使用某种其他类型的流控制黑魔法,一般来说是指
setjmp()
/
longjmp()
。我只是问在C++中是否有一个安全的使用这些函数的方法,我得到了答案。不过,我还是想知道是否有可能摆脱
*jmp()
。不,在保持可移植性的同时不可能做到这一点。我刚刚用visualstudio在Windows上进行了测试,用gcc在Linux上进行了测试。VS实现正确地调用了析构函数。gcc实现没有破坏从堆栈中删除的对象;这个库要求我传递回调函数,以及该库的某些部分(我在回调中调用),其中使用了longjmp。这是我希望永远不用调试的代码