c++ - 为什么 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 字节顺序,所以在确定之前在你的应用程序中进行测试。
解决方案
我认为这是正确的:
udp.send(reinterpret_cast<char*>(&dummy),2);
注意与号。否则,您将从地址 256 发送两个字节,这可能是随机的(充其量)。这是微控制器,所以它可能不会崩溃。第二个版本应该是:
udp.send((char*)&dummy,2);
推荐阅读
- javascript - 如何在 ReactJS 中访问功能组件中的状态?
- qiskit - 如何让qiskit打印一个量子门的真值表?
- javascript - HTML 和 Javascript 中的联系表格在 MAC Safari 和 Chorme 上不起作用。但是在windows上工作
- linux - 在 Buildroot 上配置内核以集成 RAUC
- slurm - slurm 作业因“总线错误”而崩溃是什么意思?
- javascript - 组件道具未在状态更改时更新
- python - ModuleNotFoundError:没有使用 azure 函数 + Python + 私有存储库名为“x”的模块
- jquery - 检查画布 dpi
- anchor - 如何在这个平台做主播
- c++ - 对“function_name”的未定义引用:错误:ld 返回 1 个退出状态