【发布时间】:2011-03-27 11:24:45
【问题描述】:
我的印象是,在 C++ 中使用 setjmp() 和 longjmp() 几乎肯定会弄乱堆栈,因为这些函数不会像异常那样执行展开。但是,This MSDN page 表明可以告诉 Microsoft 实现调用本地对象的析构函数,这意味着谨慎使用这些函数可能是安全的。
在 C++ 中使用 setjmp() 和 longjmp() 时,是否有可移植的方法来确保程序的正确性? C++ 的最佳实践表明,最好不要将异常用于流控制,但在需要非常不寻常的流的情况下(例如,协程和闭包),总是最好使用异常来代替这些函数吗?
【问题讨论】:
-
协程见[如何在C++中实现协程](stackoverflow.com/questions/121757/…)。
-
“在需要非常不寻常的流程的情况下”,最好问问如何实现那个特定的不寻常的工作流程。抽象问题很少有有用的答案。
-
@Dummy00001:我通过提供不寻常的控制结构的例子来泛指
setjmp()/longjmp()的各种用途,而不是试图暗示我在做其他类型的流量控制黑魔法。我只是问是否有一种在 C++ 中使用这些函数的安全方法,我得到了答案。