C++ 回调宏(QT)

C++ 回调宏(QT),c++,qt,macros,C++,Qt,Macros,我有一个签名如下的函数 int iV_SetSampleCallback(pDLLSetSample pSampleCallbackFunction) 其中pDLLSetSample为 typedef int (CALLBACK * pDLLSetSample) (struct SampleStruct rawDataSample); 我想将我的成员函数作为回调传递 int sampleCallbackFunction(struct SampleStruct sample); 当我把它

我有一个签名如下的函数

int iV_SetSampleCallback(pDLLSetSample pSampleCallbackFunction)  
其中
pDLLSetSample

typedef int (CALLBACK * pDLLSetSample) (struct SampleStruct rawDataSample);
我想将我的成员函数作为回调传递

int sampleCallbackFunction(struct SampleStruct sample);
当我把它叫做

iV_SetSampleCallback(&MainWindow::sampleCallbackFunction);
我犯了个错误

error: C2664: 'int iV_SetSampleCallback(pDLLSetSample)': cannot convert argument 1 from 'int (__thiscall MainWindow::* )(SampleStruct)' to 'pDLLSetSample'

我不明白为什么会这样。什么是
回调
宏?
\u这个电话来自哪里?如何正确地将回调传递到此函数?

发生错误的原因是您试图传递指向非静态类成员函数的指针,而不是指向常规函数的指针。请注意,非静态类成员函数具有显式
参数
CALLBACK
宏通常在Windows中使用,通常代表
stdcall
调用约定

要修复此错误,您需要

  • 将成员回调函数声明为静态
  • 将回调宏前置到成员函数,使其具有预期的调用约定(或回调扩展到的任何内容)
静态int回调sampleCallbackFunction(struct SampleStruct sample);

发生错误是因为您试图传递指向非静态类成员函数的指针,而不是指向常规函数的指针。请注意,非静态类成员函数具有显式
参数
CALLBACK
宏通常在Windows中使用,通常代表
stdcall
调用约定

要修复此错误,您需要

  • 将成员回调函数声明为静态
  • 将回调宏前置到成员函数,使其具有预期的调用约定(或回调扩展到的任何内容)
静态int回调sampleCallbackFunction(struct SampleStruct sample);

调用SensoMotoric并告诉他们回调API已损坏。任何不允许您将
void*
传递给回调函数的回调API都会被设计破坏。
pDLLSetSample
应该声明为
typedefint(CALLBACK*pDLLSetSample)(struct-SampleStruct-rawDataSample,void*userData)
int-iV\u-SetSampleCallback(pDLLSetSample-pSampleCallbackFunction,void*userData)
…调用SensoMotoric并告诉他们的回调API被破坏。任何不允许您将
void*
传递给回调函数的回调API都会被设计破坏。
pDLLSetSample
应声明为
typedef int(CALLBACK*pDLLSetSample)(struct-SampleStruct-rawDataSample,void*userData)
int-iV\u-SetSampleCallback(pDLLSetSample-pSampleCallbackFunction,void*userData)
…通常API提供了一种方法来传递一些不透明的类似指针的参数,这些参数稍后将被传递到回调中。但在您的情况下,由于某些原因,并没有这样的参数,所以您唯一的选择是在安装回调之前将该指针存储在某个全局变量中。通常,API提供了一种方法来传递一些不透明的类似指针的参数,这些参数稍后将传递到回调中。但在您的例子中,由于某些原因,并没有这样的参数,所以您唯一的选择是在安装回调之前将该指针存储在某个全局变量中。