首页 > 解决方案 > 为什么 g++ 给予者:“错误:从不同大小的整数转换为指针 [-Werror=int-to-pointer-cast]”

问题描述

我正在微控制器和计算机之间进行 UDP 连接。我使用的框架是基于 c++ 的,并且具有发送具有以下原型的 UDP 数据包的功能:

bool UdpConnection::send(const char *data, int length)

int length是指针包含的字节数。

但我正在使用返回uint16_t类型的函数进行一些输入读取。

我无法直接在这两个函数中更改任何内容。

然后我做了以下事情:

UdpConnection udp;
uint16_t dummy = 256;
udp.send(reinterpret_cast<char*>(dummy),2);

但我是一个好奇的人,所以我尝试了以下方法:

UdpConnection udp;
uint16_t dummy = 256;
udp.send((char*)dummy,2);

当我编译最后一个代码时,我得到:

error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]

在我的分析中,两个片段都做同样的事情,为什么我在最后一个中得到错误,但在第一个中却没有?

编辑:

第一段代码可以编译,但在代码运行时会出现分段错误。所以这两个代码都不起作用。

编辑2:

该问题的有效且经过测试的解决方案,但不是原始问题的答案,是:

union Shifter {
    uint16_t b16;
    char b8[2];
} static shifter;

shifter.b16 = 256;
udp.send(shifter.b8,2);

这个解决方案被广泛使用,但它不是可移植的,因为它依赖于 CPU 字节顺序,所以在确定之前在你的应用程序中进行测试。

标签: c++pointerscastingintreinterpret-cast

解决方案


我认为这是正确的:

udp.send(reinterpret_cast<char*>(&dummy),2);

注意与号。否则,您将从地址 256 发送两个字节,这可能是随机的(充其量)。这是微控制器,所以它可能不会崩溃。第二个版本应该是:

udp.send((char*)&dummy,2);

推荐阅读