Why g++ giver: "error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
Why g++ giver: "error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
我正在微控制器和计算机之间建立 UDP 连接。
我正在使用的框架是基于 c++ 的,并且具有发送具有以下原型的 UDP 数据包的功能:
bool UdpConnection::send(const char *data, int length)
int length
是指针包含的 字节数 。
但我正在使用 returns 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 字节顺序,因此请先在您的应用程序中进行测试。
我认为这是正确的:
udp.send(reinterpret_cast<char*>(&dummy),2);
注意符号。否则,您将从地址 256 发送两个字节,这可能是随机的(最多)。这是微控制器,所以它可能不会崩溃。
第二个版本应该是:
udp.send((char*)&dummy,2);
我正在微控制器和计算机之间建立 UDP 连接。 我正在使用的框架是基于 c++ 的,并且具有发送具有以下原型的 UDP 数据包的功能:
bool UdpConnection::send(const char *data, int length)
int length
是指针包含的 字节数 。
但我正在使用 returns 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 字节顺序,因此请先在您的应用程序中进行测试。
我认为这是正确的:
udp.send(reinterpret_cast<char*>(&dummy),2);
注意符号。否则,您将从地址 256 发送两个字节,这可能是随机的(最多)。这是微控制器,所以它可能不会崩溃。 第二个版本应该是:
udp.send((char*)&dummy,2);