【发布时间】:2011-05-18 09:02:54
【问题描述】:
我在编译库时收到此警告。
警告:从 'int' 转换为 'unsigned char' 可能会改变其值
这会阻止我们使用编译器选项 -Werror。
谁能建议解决这个警告的方法???
【问题讨论】:
-
触发该警告的实际代码是什么?
-
您需要在 RTMessage.inl:166 周围发布代码
我在编译库时收到此警告。
警告:从 'int' 转换为 'unsigned char' 可能会改变其值
这会阻止我们使用编译器选项 -Werror。
谁能建议解决这个警告的方法???
【问题讨论】:
编译器警告您int 可能包含不适合unsigned char 的值。
如果你绝对确定在这种情况下它总是合适的,你可以使用static_cast告诉编译器
c = static_cast<unsigned char>(i);
编译器会相信你(如果它不是真的,那是你的错)。
【讨论】:
i 模UCHAR_MAX+1 的值,在unsigned char 中,那么这就是它给你的。演员表告诉编译器您想要该结果,而不是 i 将始终在范围内 0-UCHAR_MAX :-) 如果您确实希望该值在范围内,那么我认为 boost::numeric_cast 更准确地表达了这一点.
在黑暗中拍摄:
使用static_cast 指示编译器您知道转换不会导致截断:int i; unsigned char c = static_cast<unsigned char>(i);
如果您不确定,请查看boost::numeric_cast。
在这种情况下,它等同于 static_cast,但更明确(更容易 grep / 搜索数字转换)。此外,它还执行边界检查。
【讨论】:
_flags &= static_cast<unsigned char>(~x);,但你确定~x 确实做到了你想要的吗?如果 x 在您实际尝试对其进行位操作之前是 unsigned char 类型会更简单。
最明显的答案是找出如何在编译器上禁用该警告。从其他 cmets,你正在做:
flags &= ~x;
警告这种典型习语的编译器是脑死的。
【讨论】: