C++ 为什么是g++;送礼人:“;错误:从不同大小的整数转换为指针[-Werror=int到指针转换]”;

C++ 为什么是g++;送礼人:“;错误:从不同大小的整数转换为指针[-Werror=int到指针转换]”;,c++,pointers,casting,int,reinterpret-cast,C++,Pointers,Casting,Int,Reinterpret Cast,我正在微控制器和计算机之间进行UDP连接。 我使用的框架是基于C++的,它具有发送一个UDP包的功能,它具有以下原型: bool UdpConnection::send(const char *data, int length) int length是指针包含的字节数 但是我正在使用一个返回uint16\t类型的函数进行一些输入读取 我无法直接更改这两个函数中的任何内容 然后我做了以下工作: UdpConnection udp; uint16_t dummy = 256; udp.send(r

我正在微控制器和计算机之间进行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字节顺序,因此请在应用程序中进行测试,以确定是否正确。

我认为这是正确的:

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

作为
data
参数,实际创建
char*
string消息并将其传递进来是否明智?您还可以从该字符串计算
length
的值。是的没有意义,请参阅我的编辑。有人能澄清为什么在这个问题上投反对票吗?@ifconfig我正在努力提高效率。但你是对的!“一切正常”你发送了一些东西,另一端收到了什么?你能看到我的“编辑2”吗?你能告诉我什么是最有效的方法吗?所有这些方法的效率没有差别。在任何情况下,当程序中效率低下的步骤是发送UDP数据包时,担心代码的效率是没有意义的。这比其他任何事情都需要更长的时间,所花费的时间与您编写的代码无关。这与@john编写的代码没有区别。最重要的是,使用union的方式是未定义的行为。即使存在任何差异,发送/检索UDP包的时间也会影响代码本身涉及的任何性能问题。
udp.send((char*)&dummy,2);