【发布时间】:2014-11-14 07:07:17
【问题描述】:
在我们公司,我们有一个使用-Wconversion 编译的策略,它会产生一些转换警告。虽然我同意这种额外的检查可以防止错误,但在以下情况下看到速记运算符的警告很烦人:
uint8_t byte;
byte += 8; // conversion to 'uint8_t' from 'int' may alter its value [-Wconversion]
现在可以通过将其重写为byte = (uint8_t)(byte+8) 来解决此问题,这反过来又会降低代码的可读性。
有没有更好的方法来做到这一点?
【问题讨论】:
-
我认为在这种情况下,治疗(演员)比原因更糟糕。甚至this page 也说“Wconversion 是为特定用途而设计的”。因此,一直启用
Wconversion可能不值得。 -
-Wconversion甚至没有被-Wall -Wextra -pedantic启用,正是因为它几乎没有作为警告的价值(在特殊情况下)。我同意 user694733 的观点,即任何解决此警告的方法只会使代码变得更糟——无论是强制转换、显式转换还是使用#pragma gcc diagnostic括起来的代码(推送/忽略/弹出)。 -
强制隐式提升会破坏类型系统,并通过使所有操作数为正确类型(如
byte += uint8_t(8))来挫败所有试图消除警告的尝试。这与使 0 成为无法分配给uint8_t的int的不幸机制相同,并且会导致有关有符号/无符号不匹配的警告(也与x ? 0 : 1的事物有关),除非你'你'所有文字。 0 到 127 应该与任何至少有 8 位的整数类型隐式兼容(即不会引发任何多余的警告),无论它是有符号还是无符号。 -
在 C++ 中,你永远不需要 C 风格的强制转换,也不应该使用它,因为它几乎可以防止 all 类型检查。对于转换内置类型,更喜欢使用转换构造函数语法:
uint8_t(8)。 -
@DDrmmr 在 C++ 中,“转换构造函数语法”(也称为“函数式转换表达式”)与 C 风格的转换相同。应以同等措施避免这两种情况。请参阅en.cppreference.com/w/cpp/language/explicit_cast "2) 函数转换表达式 .... 完全等同于相应的 C 样式转换表达式。"
标签: c++ c gcc compiler-warnings implicit-conversion