根据问题here,从double / float到无符号整数的直接转换不可移植。我发现我的代码中有一些情况会发生这种情况,我想告诉g ++警告我,如果发生这种情况,但我找不到这样的选择。有谁知道是否有选项可以做到这一点?
注意:我确实看到-Wconversion,但是它也会警告我不关心的所有其他转换(比如将int转换为unsigned int,这是按标准可移植的。)
编辑:这是我希望看到警告的代码示例:
double dblNumber = -234;
unsigned long uintNumber = dblNumber;
在g ++的一个版本中,这给了我一个整数值0xFFFFFF16(在2的补码中为-234)。在另一个它给我0.显然代码是模糊的,这就是为什么它可以理解为不被认为是便携式的。
答案 0 :(得分:4)
我知道你说你不想使用-Wconversion
但是它会警告你关心的问题,至少在g ++ 4.5中没有警告将long
转换为{{1 }} (例如)。对于任何其他情况,它会警告您正在进行合法的转换,只是投出。您的未来维护者将非常感谢您明确表示正在进行已知的转换,而不是从代码上下文中猜测它是否是有意的。
答案 1 :(得分:1)
当 float to int 隐式转换完成,并且截断的值不适合目标类型时,行为是未定义的,因为您的示例很好地说明了它。
如果g ++提供的唯一工具是 -Wconversion ,也许您应该制作自己的工具来过滤警告以方便您使用(我正在考虑通常的 sed , awk , perl 或 php ,但这取决于系统上这些工具的可用性,也许你可以直接做类似的事情如果您使用IDE,请从IDE中获取。)
您还可以使用specific pragma directives gcc将转化检查限制为特定文件,甚至特定代码部分。
用于在代码中查明有问题的转换的任何其他程序方法当然可以用于插入显式转换,这是您应该瞄准的目标。