在C中链接到c++库时使用setjmp和longjmp

Use of setjmp and longjmp in C when linking to C++ libraries

本文关键字:setjmp longjmp 链接 c++      更新时间:2023-10-16

我想在一个C程序中使用setjmp和longjmp,该程序链接到一个用c++实现的库(但有一个C API)。

c++代码确实做动态内存分配和指针通过API传递,但只要代码的C端正确管理这些(不透明)对象,在使用longjmp时不应该有任何混乱,对吗?

我知道在c++代码中使用这些函数是不安全的,但是在C代码中链接到c++代码应该是安全的吗?

从C代码中调用c++函数并不会使setjmp和longjmp比以往更不安全。

重要的是,如果您的库分配资源,您必须有适当的恢复代码,以确保在调用longjmp后正确释放这些资源。虽然这对于您自己的分配来说可能很容易,但对于c++库来说可能很难或不可能,这取决于您使用的C接口的结构方式。

setjmp/longjmp通常在c++中使用不安全。它们有效地复制了异常的行为,但没有正确地展开堆栈(例如,它们不会在它们强制退出的堆栈帧上运行对象的析构函数)。在可能的情况下,如果有异常,请使用异常。

好吧,正确和不正确。longjmp通常不会调用析构函数,因此在如下代码中使用它:

void f(jmp_buf jb)
{
  some_cpp_object_with_a_nontrivial_destructor x;
  if (some_condition) longjmp(jb, 2);
  // some other code
}

会使各种不好的事情发生。如果你避免了这种情况,你应该没事。(一般情况下,如果对象具有重要析构函数,longjmp不能跳过任何活动堆栈帧。)