问题标签 [setjmp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ try/catch 与 C setjmp/longjmp 有何不同?
C++
我知道使用try
andcatch
块时的异常处理。我想知道这个功能是否存在于C
. 所以,现在我知道基本的错误处理C
是由setjmp/longjmp
.
既然setjmp/longjmp
不存在于 中C++
,可以假设它try/catch
更好吗?以什么方式???
我可以在using中实现一个try/catch
功能。那有什么不同??C
setjmp/longjmp
c - 为什么将 ucontext 添加到 POSIX,然后从 POSIX 中删除?
据我所知,ucontext
提供更好的东西setjmp
。但它已被弃用,现在已从 POSIX 规范中删除。那么它为什么会出现,又为什么会被移除呢?
c - 宏地狱:指向 setjmp/sigsetjmp 的与平台无关的指针
我正在编写需要使用指向 setjmp/sigsetjmp 的指针的多平台代码。通常这就像做一样简单
但是,ISO 和 POSIX 声明 setjmp/sigsetjmp 可以定义为宏,在我的 linux 机器中确实是这种情况。以下是摘录/usr/include/setjmp.h
:
问题是,由于我没有将参数传递给sigsetjmp
,因此宏不会扩展,并且sigsetjmp
libc 中没有定义普通符号。我希望能够使用一些宏“黑魔法”来提取“__sigsetjmp”名称,但到目前为止我失败了。
另一种选择是 __sigsetjmp
直接使用,但这意味着检查每个受支持平台的扩展,我不想这样做(因此这个问题的原因)。
PS:我讨厌宏。
笔记:
我需要这个的原因有点模糊,但为了简化它,假设我想用它执行指针比较。
编辑:
是的是的。我知道我不应该指望得到一个指针,sigsetjmp
因为它在某些平台上甚至可能不是一个函数,但这并不能解决我的问题。
在实践中,我所知道的所有平台都将它作为一个函数来实现。
我可以应付这样一个事实,即在几年内,我遇到了一个sigsetjump
不适用于某些平台的功能的案例。但是我不想处理的是遍历每个受支持的平台并检查setjmp.h
宏定义,这是我现在唯一的选择。
我很欣赏对标准的引用,但我想得到一个实用的答案,而不是纯粹的答案。
windows - 向量异常处理程序中的 longjmp
64 位 Windows 程序中的某些类型的事件,例如被零除、空指针引用、堆栈溢出(如果您使用保护页检测到),通常会使用结构化或向量异常来处理(在发现有必要处理它们的程序中) .
在 JIT 编译器的上下文中,结构化异常有点尴尬,因为需要提供展开信息并符合所有函数的展开协议,这可能无法与移动代码块的复制垃圾收集器很好地交互,这表明使用向量异常。
虽然通常期望向量化异常处理程序返回,但将它们用于此目的将涉及使用 longjmp 或一些等效的代码退出处理程序,这些代码会重置堆栈指针而不进行任何展开。
这是合法的,还是我忽略了一些绊脚石?
Unix 中的等价物似乎是合法的,因为它的价值:Longjmp out of signal handler?
c++ - 在 longjmp/croak 之前显式调用析构函数
我正在为 C++ 库编写一个 PERL XS 接口。croak
当库抛出异常时我需要调用。
直接在异常处理程序中执行它会错过对捕获异常的析构函数的调用,正如longjmp
调用所期望的那样。这很重要,因为异常包含不会被释放的字符串成员。
显而易见的解决方案是croak
在 catch 块之后执行,如果捕获到异常,如下所示:
但我想知道:在 ? 之前显式调用捕获的异常的析构函数是否足够longjmp
?像这样:
visual-c++ - 对 longjmp 的调用导致程序在 msvc 2010 上以代码 0 退出
我正在尝试使用setjmp/longjmp
错误处理,但是,对 longjmp 的调用导致程序在使用 MSVC 2010 编译时以代码 0 退出,这是完整的消息:
这是代码:
我使用基于 gnu 的编译器(cygwin 下的 bfin-elf-gcc)编译了相同的代码,效果很好。IE,
知道为什么它不能在 msvc 上运行吗?
非常感谢,哈桑。
c - 在 setjmp.h 中定义的 C 中的非本地跳转如何工作?
C 参考手册的附录 B 描述了两个函数setjmp
和longjmp
一个称为非本地跳转的东西。除了setjmp
保存状态信息和 longjmp 恢复的基本了解之外state
,我一直无法理解此功能的确切流程和用例。
那么,这个功能究竟完成了什么,它在哪里有用?
c - 即使在存在非局部跳跃的情况下也能稳健地检测递归
我有一个特定的函数(信号处理程序),我想检测它的递归,即确定该函数是否直接或间接调用了它自己。棘手的一点是,该函数在某一时刻调用了一些不受其控制的代码,而该代码可以做任何事情。
通常,我会写一些类似的东西
但在这种情况下,我担心othercode
可能会使用 alongjmp
或类似来突破,导致recursed
保持为 1。如果我的函数以这种方式跳出,我想确保它不会将自己视为递归 if 稍后被调用(longjmp
否则它不是问题的事实)。
注:我认为longjmp
有可能。这othercode
是来自其他一些野外代码的链接信号处理程序,并且确实存在用于恢复上下文的处理程序SIGSEGV
(longjmp
例如,作为“故障保护”异常处理程序)。请注意,longjmp
在同步信号处理程序中使用通常是安全的。无论如何,我并不特别关心其他代码是否安全,因为它不在我的控制之下。
c++ - 为什么我看到这个 libzdb 配置错误?
我正在尝试在我的 macbook 上安装 libzdb,但是在运行配置时看到以下错误消息: configure:13334: error: setjmp is required
setjmp.h 文件位于/usr/include中,并在我的“$PATH”中指定为
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/usr/include
有人可以建议我如何纠正这个问题吗?
提前致谢