【问题标题】:Callback function and void pointer C++回调函数和空指针 C++
【发布时间】:2021-03-23 00:38:04
【问题描述】:
ps3000aGetStreamingLatestValues
(
int16_t handle,
ps3000aStreamingReady lpPs3000AReady,
void * pParameter
)
  1. lpPs3000AReady,指向你的ps3000aStreamingReady回调函数的指针

  2. pParameter,一个void 指针,将被传递给ps3000aStreamingReady 回调。回调可以选择使用此指针向应用程序返回信息。

这里是ps3000aStreamingReady回调函数:

typedef void (CALLBACK *ps3000aStreamingReady)
(
int16_t handle,
int32_t noOfSamples,
uint32_t startIndex,
int16_t overflow,
uint32_t triggerAt,
int16_t triggered,
int16_t autoStop,
void * pParameter
)

我的问题是如何在我的主函数中声明pParameterpParameter 用作这两个函数之间的通信器,它是一个 void 指针,因为它可能必须传递任何类型的数据。不知何故,我必须在将这个 void 指针作为这些函数的参数传递之前分配内存。但怎么能做到呢?

【问题讨论】:

  • void* 参数需要包含什么?
  • * pParameter,一个从 ps3000aGetStreamingLatestValues.ps3000aStreamingReady 回调函数传来的空指针,可以写到这个位置,将任何数据,例如状态标志,发送回应用程序。
  • void* userData 是捕获额外数据的 C 方式,带有 std::function 的 C++ 方式允许捕获 lambda 甚至自定义函子。
  • 您可以将指向(几乎)任何东西的指针作为声明为void* 的参数传递。如果你真的想要,你可以添加一个显式转换(在函数调用中)。
  • @AnikIslam 需要从pParameter获取哪些参数,以便调用lpPs3000AReady

标签: c++ pointers callback void void-pointers


【解决方案1】:

允许额外参数的传统回调 C 方式是拥有用户提供的额外 void*

using callback = bool (int, int, void* userData);

struct CallBack
{
    bool operator ()(int a, int b) { /*..*/ }

    // extra members ...
};

bool run_callback(int a, int b, void* userData) {
    CallBack* c = reinterpret_cast<CallBack*>(userData);

    return (*c)(a, b);
}

可能的用法:

CallBack t(true); // Care to lifetime, should still be there when `run_callback` is called
Register(&run_callback, &t); // Would call later run_callback(2, 3, &t);

如果你不需要那个额外的参数,你可以传递你的常规函数​​和nullptr

bool run_callback(int a, int b, void*) {
    // ...
}

Register(&run_callback, nullptr); // Would call later run_callback(2, 3, nullptr);

对于 C++ 的类型擦除方式,您可以使用std::function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多