在C语言中,如果出现“长JMP”,有没有办法清理;通过;我的功能?

在C语言中,如果出现“长JMP”,有没有办法清理;通过;我的功能?,c,resource-cleanup,setjmp,C,Resource Cleanup,Setjmp,我有以下调用堆栈: library_function_1 ====> my_function ====> library_function_2 calls calls 在C++中,如果库函数> 2/代码>抛出异常,而代码> LabyAyActudio 1/代码>捕获它, MyObjys可以使用析构函数(即RAIII)安全地清理(释放资源等)。 在C#中,类似地,my_函数可以使用try/最终和语句进行清理 在C语言中,如

我有以下调用堆栈:

library_function_1 ====> my_function ====> library_function_2
                   calls             calls
在C++中,如果<代码>库函数> 2/代码>抛出异常,而代码> LabyAyActudio 1/代码>捕获它,<代码> MyObjys<代码>可以使用析构函数(即RAIII)安全地清理(释放资源等)。 在C#中,类似地,
my_函数
可以使用
try
/
最终
语句进行清理


在C语言中,如果
library\u function\u 1
使用
setjmp
library\u function\u 2
longjmp
s返回到它,那么
my\u function
有什么方法清理吗?

唯一的方法是传递
setjmp()
函数中的信息
library\u function\u 1
是通过您的函数生成的(或您有权访问它)。您可以保存从函数中获得的信息,然后在函数代码中执行另一个
setjmp()
,并将其传递给
library\u function\u 2
。。。在这种情况下,您将截获调用嵌套并返回
setjmp()。。。内在的功能将返回给你,因为它是从你那里得到的。。。然后,您必须执行
longjmp()
到从
library\u function\u 1
收到的位置


但是,如果您无法访问这些信息,就没有办法截获它。

简而言之,唯一的答案是不,这是不可能的<代码> SETJMP <代码> />代码> LojMP:/Cuff>不允许像C++异常那样堆栈展开。这是可能的,但是只有当<代码> LabyAyActudio1[/Cult]的库暴露出一种显式机制来<代码> MyObjySuth/Cuff>登记清理注册表时,才能清除清理处理程序。(这或多或少是一种C++异常处理的一种味道。)<代码> SETJMP <代码> /Cord> LojMP >代码>这真的是一个非常丑陋的黑客,它在计算时代的回溯中对它的创造者来说似乎很有创意。从那以后,我们积累了更多的智慧
setjmp
实际上只是保存当前堆栈指针和返回地址,而
longjmp
将这两个值恢复到其保存状态。这完全忽略了跳转时堆栈上的内容,唯一发生的事情是重置。这种幸福的无知对许多虫子养殖场来说是一块肥沃的土地。所以,最好忘记
setjmp
/
longjmp
曾经存在过,你会因此成为一个更好的程序员。“最好忘记
setjmp
/
longjmp
曾经存在过”-不幸的是,在这种情况下这是不可能的,因为我使用的是一个使用这些函数的库。在这种情况下,我为你感到抱歉。我知道你的困境。过去的错误一直困扰着我们。对我来说,库的这种行为是切换到不使用
setjmp
/
longjmp
的其他库的一个非常好的参数,前提是有这样的替代方案。如果你别无选择,我同情你的厄运。