带有功能指针的C 回调

C++ callback with function pointers

本文关键字:回调 指针 功能      更新时间:2023-10-16

我正在编写使用第三方库打开专有文件的C 应用程序。在我的应用程序中,用户可以做类似的事情:

int main(int argc, char* argv[]) {
  CustomFileFormat f1;   
  f1.open( "c:/file1.xyz" );
  f1.process();
  CustomFileFormat f2;   
  f2.open( "c:/file2.xyz" );
  f2.process();
  Result r = f1.compare( f2 );
  r.generateReport();
  return 0;
}

我遇到的问题是Process()函数。此函数将命令发送到第三方库,该库揭示了这样定义的回调函数:

typedef void (*FileProgressCallback)( double dProgress, bool& shouldAbort );

将从第三方库中调用此回调函数,告诉我已经处理了多少文件(接收到的dprogress值将在0到1之间),以及我可以使用的应该用来导致处理停止的bool bool变量。

我遇到的问题是我不知道如何编码process()函数,以便在调用回调时,我知道返回的结果是例如F1还是实例F2。是否可以定义我的CustomFileFormat类的成员函数,以便在称呼它时,我知道正在使用哪个?

一种简单的方法是在.process()呼叫之前,要设置一个带有某些上下文的全局。如果将全球变成堆栈,您甚至可以执行递归处理(尽管如上所述,听起来并不是您需要的一部分)。

一个更复杂的答案是使用诸如Libffi封闭之类的东西(该库可从https://sourceware.org/libffi/或https:/https://github.com/libffi/libffi获得)。库的那部分实际上在运行时生成了(小)代码,可以将其他参数与从呼叫者接收的参数相关联。