1

我遇到了libmodbus的编译问题。我有以下代码

boost::shared_ptr <modbus_t> ctx;
ctx->modbus_new_tcp(ip_address.c_str(), modbus_port);

但我收到以下错误

error: invalid use of incomplete type 'struct _modbus'

它指向 modbus.h 中的这一行

typedef struct _modbus modbus_t;

我对此了解不够,无法解决我的问题。你认为那是什么?这个库与智能指针不兼容吗?他们告诉您使用常规指针

modbus_t* ctx;

谢谢你。

4

2 回答 2

3

你可以——也许——使用

if (std::unique_ptr<modbus_t, void(*)(modbus_t*)> mb(modbus_new_tcp(ip_address.c_str(), modbus_port), &modbus_free)) {

    modbus_connect(mb);

    /* Read 5 registers from the address 0 */
    modbus_read_registers(mb, 0, 5, tab_reg);

    modbus_close(mb);
} // modbus_free invoked, even in the case of exception.

当然,这是假设存在唯一所有权。

于 2015-09-09T21:51:39.947 回答
1

事实上,这似乎是一个 C 风格的 API,它们完全隐藏了modbus_t作为用户的你的实现(因为你将指针传递给自由函数而不是调用对象成员)。

这意味着您不能shared_ptr开箱即用(因为它需要定义来调用delete,这也恰好是错误的调用)。可能有一种方法可以使用调用适当的清理函数(可能modbus_free)的自定义删除器。.get()然后,您必须在想要调用 API 的任何时候使用来获取原始指针。

于 2015-09-09T20:28:53.723 回答