3

首先,这绝对是关于 C 的,不需要 C++ 解决方案。

目标:返回调用函数(A)超出多个堆栈帧。

我有一些解决方案,但没有一个是最好的选择。

实现意义上最简单的一个是 longjmp/setjmp,但我不确定它是否会破坏自动变量,因为正如 wiki 所指,如果执行 longjmp,则不会参与正常的堆栈展开。

以下是程序流程的简短描述:A函数调用file processing函数,这会导致许多内部和递归调用。在某些时候,文件阅读器遇到了 EOF,所以工作 file processing已经完成并且应该控制A功能。

将每个读取的字符与 EOF 或 '\0' 进行比较?不,谢谢。UPD:我可以避免 setjmp 和 longjmp 之间的调用链中的动态分配。

不确定自动变量,我不知道顺序调用会发生什么file processing(有多个文件)。

所以:

1) longjmp 的“无堆栈展开”怎么样?如果我得到所有可用的数据持有者(指针),那有多危险。

2) 其他简洁有效的返回A框架的方法?

4

1 回答 1

3

我不知道你在某处读到了什么,但这setjmp/longjmp正是为这项任务预见的工具。

longjmp准确地(很好地)重新建立“堆栈”,就像在调用 时一样setjmp,在两者之间对“堆栈”所做的所有修改都将丢失,包括所有auto已定义的变量。这种堆栈的重新建立是蛮力的,在 C 中没有析构函数的概念,这可能意味着“没有堆栈展开”。

我将“堆栈”放在引号中,因为这不是 C 标准适用的术语,它只讨论状态并允许按照实现的方式组织它。

现在,您可以从 和 之间保留的唯一信息setjmplongjmp

  • 您传递给的值longjmp
  • 您之前定义的修改volatile对象的值setjmp

所以在你回来的分支中,longjmp你必须使用这个(并且只有这个)信息来清理你的混乱:关闭文件、free你的对象malloced等。

于 2015-01-02T09:33:08.823 回答