【问题标题】:Explicit type conversion really necessary?显式类型转换真的有必要吗?
【发布时间】:2021-01-25 18:49:56
【问题描述】:

Arduino 的 LiquidCrystal 库定义

 virtual size_t write(uint8_t);

在他们的example 中,您会发现对该函数的一些调用:

lcd.write(byte(0)); // when calling lcd.write() '0' must be cast as a byte
lcd.write((byte)1);
lcd.write(4);

我的 C++ 有点生疏了,所以我不确定他们为什么说它必须转换为字节?

我的意思是你不会做类似byte a = byte(0); 的事情,对吧?

根据我在 C++ 参考中的记忆和发现,这种类型转换应该隐式发生,因此无需在函数调用中显式转换。

这个文档/示例是否像我认为的那样不一致和糟糕?还是我在这里遗漏了什么?

【问题讨论】:

  • write 函数可能有重载?在这种情况下,您需要演员来选择正确的电话。我还注意到你链接的代码使用了像lcd.write(3);(没有演员)这样的调用。
  • 尽可能避免隐式强制转换,让您的代码更具可读性且不易出错

标签: c++ casting


【解决方案1】:

我怀疑这是由于基类Print 中的这两个重载:

virtual size_t write(uint8_t);
size_t write(const char *str);

如果调用为write(0),则write(const char *) 重载将被选为更好的候选(第一个需要缩小转换,但0 空指针)。

所以要发送0 字节,您必须使用显式转换来帮助编译器选择正确的重载:write((uint8_t)0)


此外,如果您让较大的类型隐式转换为较小的类型,您可能会收到警告“缩小转换,可能丢失数据”。因此,使用显式转换告诉编译器您知道自己在做什么总是一个好主意。

【讨论】:

  • 也许我忽略了一些东西,但 LiquidCrystal 只有一个重载:LiquidCrystal::write(uint8_t value)
  • @largest_prime_is_463035818 它实现了虚函数,但是类inherits来自Print
猜你喜欢
  • 2018-04-05
  • 2021-01-25
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2010-10-18
相关资源
最近更新 更多