如何解决这个"从不同大小的类型转换为指针"警告?

时间:2014-05-01 22:53:44

标签: c++ qt casting reference qdbus

我有两个通过D-Bus进行通信的程序。在其中一个函数中有一个函数,它接受两个参数,即const char* dataint size,而在另一个参数中,我有一个返回类型unsigned char的值的函数。我在第一个程序中放置了一个函数调用,如function((char*)program2->function().value(), 1)但是我得到警告强制转换为指针来自不同大小的整数[-Wint-to-pointer-cast] 。我该如何解决这个警告?我也在使用Qt库。

编辑:

实际上在采用const char*int的函数中,我将数据附加到QByteArray,该const char*接受int且大小为unsinged char它是由Qt提供的构造函数,而另一个程序应该返回0-255范围内的数字,因此inline QDBusPendingReply<uchar> type() { QList<QVariant> argumentList; return asyncCallWithArgumentList(QLatin1String("type"), argumentList); } 。如果我所做的是错误的,那么获得所需结果的最佳方法是什么?

同时调用program2-&gt;函数调用以下内容:

inline typename Select<0>::Type value() const
    {
        return argumentAt<0>();
    }

这个类有一个名为value()的函数,它调用:

QByteArray

注意:这个问题的主要目的是找出一种方法来创建对调用代理类中定义的函数的返回结果的引用,而不是如何将其转换为可接受的内容创建QByteArray,请停止添加QtCore或{{1}}等无关标签。

3 个答案:

答案 0 :(得分:3)

您需要的是数据的地址......看起来像

function2(& program2->function().value(), 1);

并且是完全安全的,因为临时变量的生命周期直到完整表达式的结束,这足够长 1 以使function2使用它。

不幸的是,您无法在右值上使用&地址运算符。但是有一种解决方法,因为你可以将const左值引用绑定到右值,并且你想要一个指向const数据的指针:

template<T>
const T* get_addr(const T& v) { return &v; }

function2( get_addr(program2->function().value()), 1 );

如果您获得了签名与未签名,不匹配,请尝试

function2( get_addr<char>(program2->function().value()), 1 );

当然,为了避免给变量命名,我需要做很多工作,如Captain Obvlious has done


1 除非function2保存该指针以供日后使用,但如果确实如此,那么您不应该使用局部变量来保存该值,而是要非常密切关注对象寿命。

答案 1 :(得分:1)

我不认为你在做什么是安全的,因此你的代码可能根本不起作用。如果你的function()返回一个“unsigned char”,它将复制它并返回它。同时你的另一个函数()采用“const char *”。我建议修改你的program2-&gt; function()以返回“char *”。

答案 2 :(得分:0)

将整数转换为指针并不是一个好主意,特别是如果你不知道为什么转换是必要的以及它究竟是做什么的。看起来转换甚至不是必需的,你真的需要一个解决方案来正确调用函数而不是修复强制转换警告。从您提供的代码和说明中,您似乎希望将调用返回的单个字节发送到program2->function()。由于此函数返回的值是右值,因此您无法直接获取其地址。相反,您可以将其存储在变量中,然后将指针传递给它。类似下面的代码应该让你做你想做的事。

char value = program2->function();
function(&value, 1);