C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()



在使用某些C++库时,我经常遇到参数需要指向函数的函数。这意味着方法将不被接受。

比如性病的atexit(void (__cdecl*)(void));

在这种情况下,当您想从方法传递功能时,从类调用此类函数非常不方便。

我知道这两种解决方法,但它们有缺点/似乎不可能:

  • 将方法声明为静态:表示该方法不能调用任何 来自同一类的其他非静态方法。
  • 传递实际函数:绝对是一团糟,可能需要所有 各种黑魔法来执行propper功能 在方法内。

对于这些情况,通常还有哪些其他解决方法?或者至少对于从一个类调用 atexit(( 示例,其中一种方法作为退出函数是理想的。

atexit

函数在程序退出时以相反的顺序调用。此时还调用本地静态对象析构函数。所以在这个例子中:

void f()
{
static X x;
atexit(f1);
static Y y;
}

在第一次调用时,xy析构函数将被注册为在程序退出时调用,并且f1()将在y.Y::~Y()x.X::~X()之间调用。

因此,如果创建要在销毁集合时调用的std::function对象的集合,这可能是一种可行的解决方法。

它仍然可能无法很好地用于多个函数,因为所有函数都将在单个循环中调用,而不是相对于其他静态析构函数/退出调用的 LIFO 顺序。


另一种选择可能是查看at_thread_exit.它具有不同的语义,但也可能满足您的需求。


@Remy Lebeau提到的Thunk可能是最好的解决方法。但实施起来可能并不容易,这就是为什么我建议也考虑其他解决方法。

相关内容

最新更新