【问题标题】:Why g++ giver: "error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"为什么 g++ 给予者:“错误:从不同大小的整数转换为指针 [-Werror=int-to-pointer-cast]”
【发布时间】:2019-12-07 09:46:06
【问题描述】:

我正在微控制器和计算机之间进行 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]

在我的分析中,两个 sn-ps 都做同样的事情,为什么我在最后一个中得到错误而在第一个中没有?

编辑:

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

编辑 2:

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

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

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

此解决方案被广泛使用,但由于它依赖于 CPU 字节顺序,因此不可移植,因此请先在您的应用程序中进行测试以确定。

【问题讨论】:

  • 作为 data 参数,实际创建一个char* 字符串消息并将其传入不是很明智吗?您还可以根据该字符串计算 length 的值。
  • 是的没有意义,看我的编辑。
  • 有人能解释一下为什么这个问题被否决了吗?
  • @ifconfig 我正在努力提高效率。但你是对的!
  • "everything works" 你发东西,对方收到什么?

标签: c++ pointers casting int reinterpret-cast


【解决方案1】:

我认为这是正确的:

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

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

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

【讨论】:

  • 你能看到我的“EDIT 2”吗?你能说出最有效的方法是什么吗?
  • 所有这些方法的效率没有区别。无论如何,当您的程序中低效的步骤是您正在发送 UDP 数据包时,担心代码的效率是没有意义的。这比其他任何事情都需要更长的时间,并且所花费的时间与您编写的代码无关。
  • @john 写的没有区别。最重要的是,您使用联合的方式是未定义的行为。即使有任何差异,发送/检索 UDP 包的时间也将解决与代码本身相关的任何性能问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2022-12-11
  • 2014-03-20
  • 1970-01-01
  • 2015-06-04
  • 2021-03-10
相关资源
最近更新 更多