首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用longjmp/setjmp进行C错误处理的一些“好”方法是什么?

使用longjmp/setjmp进行C错误处理的一些“好”方法是什么?
EN

Stack Overflow用户
提问于 2009-05-04 12:23:14
回答 5查看 11.3K关注 0票数 20

我不得不在一个项目中使用C,我正在考虑使用longjmp/setjmp进行错误处理,因为我认为在一个中心位置处理错误将比返回代码容易得多。如果有一些关于如何做到这一点的线索,我将不胜感激。

我特别关心的是,如果发生任何这样的错误,资源清理是否被正确完成。

另外,如何处理导致多线程程序使用它们的错误?

更好的是,是否已经存在一些用于错误/异常处理的C库?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-05-04 15:12:11

票数 13
EN

Stack Overflow用户

发布于 2009-05-04 17:44:24

如果您担心资源清理,那么您必须认真考虑longjmp()和setjmp()是否是一个好主意。

如果您设计您的资源分配系统,以便您实际上可以准确地清理,那么它是可以的-但是,如果您的代码所使用的标准库实际上分配了必须释放的资源,那么这种设计往往是棘手的,而且通常是不完整的。它需要格外小心,而且因为它并不完全可靠,所以不适合可能需要多次使用setjmp()/longjmp()调用(它们会泄漏、扩展并最终导致问题)的长时间运行的系统。

票数 14
EN

Stack Overflow用户

发布于 2009-05-04 12:35:43

Symbian用longjmp()实现了它的Leave机制,这是你需要做的所有事情的一个很好的演练。

Symbian有一个全局的“清理堆栈”,如果发生跳跃,你可以推送和弹出你想要清理的东西。这是在抛出C++异常时C++编译器自动展开堆栈的手动替代方法。

Symbian有“陷阱工具”可以跳出来;它们可以嵌套在一起。

(塞班最近在C++异常方面重新实现了它,但接口保持不变)。

总而言之,我认为适当的C++异常不太容易出现编码错误,而且比使用自己的C等效物要快得多。

(例如,当异常不被抛出时,现代C++编译器非常擅长“零开销”异常;longjmp()必须存储所有寄存器的状态,即使后来没有进行跳转,因此从根本上讲永远不会像异常那样快。)

使用C++作为更好的C语言,因为您只采用异常和RAII,如果使用longjmp()进行异常模拟对您很有吸引力,这将是一个很好的方法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/819864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档