对这行代码感到困惑,该行代码的目的是将类摄入无效指针

时间:2019-05-31 03:07:23

标签: c++ pointers void

我一直在学习如何将数据发送到名为FogLAMP https://github.com/foglamp/的程序,而我要发送的数据是异步的。我的问题不是关于foglamp代码库本身,而是关于下面的代码行。

我大致了解代码在做什么。但是我不知道内存的确切机制或语法。

我会尽我所能描述发生的事情,但我不确定。

这是代码获取,因此由于程序正在运行两个异步线程(数据收集和发送进程(pid(1))以及将实际代码设置为守护进程(pid(2))),因此设计用于分配一个void指针(void * m_data),该指针最终将被应通过进程(1)发送到云的Reading对象填充。但是,此读数是在过程(2)中产生的。因此,我认为正在进行的是进程(2)在内存中生成一个Reading对象,以便进程(1)可以访问该数据。

尽管如此,我却迷失了这一行代码(我在下面包括了相关代码以遵循执行路径)。

void    (*m_ingest)(void *, Reading);

我在任何地方都没有看到这种语法,而且我似乎无法向google描述此语法,因此我不完全确定这在C ++中意味着什么。

很抱歉,我无法提供更多信息。我不确定如何描述它,有点像强制转换为类型m_ingest(这不是全局变量或typedef)。

我正在浏览这段代码,因为我想使用机器人操作系统(ROS)将相同的东西实现到我自己的foglamp插件中,作为多线程异步数据传输到foglamp。

这是有问题的代码

void    (*m_ingest)(void *, Reading);
void    *m_data;

这两个变量出现在以下函数中(不完全确定(* cb)(void *,Reading)的含义。

void OPCUA::registerIngest(void *data, void (*cb)(void *, Reading))
{
    m_ingest = cb;
    m_data = data;
}

/**
 * Called when a data changed event is received. This calls back to the south service
 * and adds the points to the readings queue to send.
 *
 * @param points    The points in the reading we must create
 */
void OPCUA::ingest(vector<Datapoint *>  points)
{
string asset = m_asset + points[0]->getName();

    (*m_ingest)(m_data, Reading(asset, points));
}

该评论非常有帮助,指出摄取将Datapoint指针数组放入队列以发送到foglamp。这样做是有道理的,但是我想对内存中实际发生的情况进行更详尽的解释。

有问题的源代码可在存储库中找到 https://github.com/foglamp/foglamp-south-opcua

这是源代码 https://github.com/foglamp/foglamp-south-opcua/blob/develop/opcua.cpp

这是头文件 https://github.com/foglamp/foglamp-south-opcua/blob/develop/include/opcua.h

1 个答案:

答案 0 :(得分:0)

这里非常基本的c ++。感谢@ 1201ProgramAlarm。它只是一个函数指针。我在https://www.cprogramming.com/tutorial/function-pointers.html处阅读了快速教程。但是我现在看到(* cb)是通过register_ingest传递的函数指针,以将m_ingest分配给与(* cb)相同的函数。因此,当雾灯需要数据时,它将通过m_ingest访问数据。此功能很有帮助

void plugin_register_ingest(PLUGIN_HANDLE *handle, INGEST_CB cb, void *data)
{
OPCUA *opcua = (OPCUA *)handle;

    if (!handle)
        throw new exception();
    opcua->registerIngest(data, cb);
}

因此INGEST_CB是在某些foglamp头文件中定义的全局回调函数,然后将其分配给与m_ingest相同的地址。

无法学习C ++中的新知识。我从未见过函数指针以这种方式传递,只是函数地址(即通过std :: bind(&func,param))。