首先,这绝对是关于C的,不需要C ++解决方案。
目标:
返回多个堆栈帧之外的调用函数(A
)。
我有一些解决方案,但没有一种感觉是最好的选择。
实现意义上最简单的是longjmp / setjmp,但我不确定 如果它破坏了自动变量,因为正如维基所指,没有正常的堆栈展开 如果执行longjmp则参加。
以下是程序流程的简短说明:
A
函数调用file processing
函数,这导致许多内部函数
和递归调用。在某些时候,文件阅读器符合EOF,所以工作
file processing
已完成,应对A
函数进行控制。
将每个阅读角色与EOF或'\ 0'进行比较?不用了,谢谢。 UPD:我可以避免在setjmp和longjmp之间的调用链中进行动态分配。
不确定自动变量,我不知道顺序调用会发生什么
到file processing
(有超过1个文件)。
所以:
1)关于longjmp的'没有堆栈展开'是什么意思?如果我得到所有的话,那会有多大的危险 数据持有者可用(指针)。
2)回到A
框架的其他简洁有效的方法?
答案 0 :(得分:3)
我不知道你在某处读到了什么,但setjmp/longjmp
正是预见到的任务工具。
longjmp
重新建立"堆栈"正如调用setjmp
所做的那样,完全(很好),对#34;堆栈的所有修改"在两者之间完成的工作将丢失,包括已定义的所有auto
变量。这种堆栈的重建是蛮横的,在C中没有析构函数的概念,这可能意味着"没有堆栈展开"。
我把" stack"在引号中,因为这不是C标准适用的术语,它只涉及状态,并允许这样组织它对实现的满意程度。
现在,您可以在setjmp
和longjmp
之间保留的唯一信息是:
longjmp
volatile
setjmp
个对象的值
因此,在你从longjmp
回来的分支中,你必须使用这个(并且只有这个)信息来清理你的混乱:关闭文件,你free
等的malloced
个对象