为广泛使用 longjmp 和多个跳转目标进行错误管理的旧 C 代码生成 C++ API 的正确方法是什么?
我的想法是编写一个为每个使用的目标设置跳转目标的函数,例如:
void catchJumps() {
if (setjmp(target1)) throw Error1(); //Error1 and Error2 are some exception classes
if (setjmp(target2)) throw Error2();
//...
}
然后我会调用catchJumps
每个使用 C 代码的 C++ 函数(在每个范围内,更具体地说):
int some_wrapper() {
catchJumps();
callCFunction()
for (int i = 0; i < 1000; i++) {
catchJumps();
callOtherCFunction();
}
catchJumps();
callOneMoreCFunction();
callEvenOneMoreCFunction();
}
这是在不破坏堆栈的情况下捕获所有跳远的安全方法吗?我知道,将 longjmp 放入不同的堆栈帧是很危险的。现在我的函数catchJumps
在另一个堆栈框架中,而不是在调用some_wrapper
. 我希望(或者我什至可以做到)catchJumps 可以内联,以便框架是相同的,但我不知道。
每个作用域中的调用(以及上面的循环之后)应该是调用作用域对象的所有析构函数所必需的,对吧?
如果这不是将 longjmps“转换”为调用应用程序的断言的有效方法,我们还能做什么?