gpt4 book ai didi

c++ - longjmp 展开的 C/C++ 实现?

转载 作者:IT老高 更新时间:2023-10-28 22:41:37 25 4
gpt4 key购买 nike

是否存在主要的 C/C++ 实现,其中 longjmp 函数“展开”,即它与自动存储对象的析构函数交互的位置,__attribute__((__cleanup__(...)) )、POSIX 线程取消处理程序等,而不仅仅是恢复 setjmp 保存的寄存器上下文?我对具有此属性的 POSIX 实现的存在(或不存在)特别感兴趣,但 C/C++ 通常也很有趣。

为了赏金,我正在寻找符合 POSIX 或至少类似 POSIX 的系统,而不是已经提到的 Windows。

最佳答案

我试图理解这里试图实现的逻辑目标。

setjmp(3) 手册页指出:

setjmp() saves the stack context/environment in env for later use by longjmp(3). The stack context will be invalidated if the function which called setjmp() returns.

这表示如果您从执行 setjmp() 调用的堆栈上下文返回,则不能再 longjmp 回到它。否则,未定义的行为。

好的,所以在我看来,在进行有效的 longjmp 调用时,setjmp 必须位于当前堆栈上下文中的某个位置。因此,展开堆栈并调用 auto 变量的所有析构函数等的 longjmp 在逻辑上似乎等同于抛出异常,并在最初进行 setjmp() 调用时捕获它。

抛出和捕获异常与您想要的 setjmp/longjmp 语义有何不同?比如说,如果你有你想要的 setjmp/longjmp 实现,那么用普通的 try/throw 替换它并捕获抛出的异常会有什么不同?

我能看到的唯一区别是 try/catch block 引入的额外内部范围;而 setjmp 并没有真正打开一个新的内部作用域。

因此,这里的答案似乎很简单:每个兼容的 C++ 实现都有一个具有所需语义的 setjmp/longjmp 等效项。它被称为 try/throw/catch。

关于c++ - longjmp 展开的 C/C++ 实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25557384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com