在C中使用setjmp和longjmp是不错的编程习惯?

Joh*_*0te 15 c unix exception

我是一名C++程序员,习惯于OO语言,具有良好的异常处理能力.

根据我的理解,setjmp和longjmp本质上是一种传播异常条件的c风格方式.它们看起来像是一种强烈形式的goto,它可以传播堆栈.

所以,首先:在这个时间点直接使用这些是好的做法,还是被弃用了?(注意:C不是C++).

其次,它们是否在C++中有任何用处,或者我认为它们是一种遗留机制,并被C++的异常处理功能所取代?

Dav*_*nco 7

从本质上讲,你的断言是正确的,jmp式样传播基本上与之相同goto.阅读Dijkstra(着名的和有争议的)关于gotos的论文(我认为)提供了合理的推理,为什么gotos应该很少被使用.除非你确切知道为什么要做你正在做的事情(或者你在非常特定的领域工作 - 例如嵌入式编程),否则你不应该触摸goto或者longjmp.

  • 为"除非你确切知道为什么要做你正在做的事情",否则为+1.我唯一一次使用`setjmp/longjmp`是在使用libpng库时 - 当libpng在解码PNG文件时遇到错误时,它希望`longjmp`回到你的代码,所以你必须调用` setjmp`正确使用它. (3认同)
  • 哇,这似乎是一个非常愚蠢的设计。相反,它可以被写入“longjmp”回到 libpng 本身的入口点,然后简单地向调用者返回错误代码...... (3认同)
  • @greggo这就是为什么标准规定在这种情况下使用volatile变量,从而避免你描述的未定义的行为. (3认同)

lur*_*her 5

它们用于实现协同程序.网上运行着几个c ++协程库,在Unix/Linux中将用于setjmp/longjmp实现该功能.

因此,如果你的目标是实现一个协程库,那么如果它的良好实践与否则它是一个没有实际意义的点,因为在这些平台上它是支持该功能的唯一方法.

如果你的目标是使用协程库,你应该搜索其中一些.甚至还有一个名为boost :: context的提升保险库提案已获批准.

  • @R.:他们解决了与线程解决完全不同的问题.如果我想要一堆小的堆栈,其功能以可预测的方式相互影响(比如生成器/消费者,或类似边缘的树算法),那么我想要协程,而不是线程. (2认同)