g++ 在不使用 -Wconvert 的情况下将 double/float 转换为无符号整数时发出警告

g++ warn when double/float is converted to unsigned integer without using -Wconversion

本文关键字:转换 float 无符号整数 警告 double -Wconvert 情况下 g++      更新时间:2023-10-16

可能的重复项:
g++ - 墙不警告双> int cast

根据这里的问题,从双精度/浮点数到无符号整数的直接转换是不可移植的。 我发现我的代码中有一些发生这种情况的情况,我想告诉 g++ 如果发生这种情况,我会警告我,但我找不到这样的选项。 有谁知道是否有这样做的选项?

注意:我确实看到了 -Wconversion,但这也警告了我不关心的各种其他转换(例如将 int 转换为无符号 int,根据标准是可移植的)。

编辑:这是一个我希望看到警告的代码示例:

double dblNumber = -234;
unsigned long uintNumber = dblNumber;

在 g++ 的一个版本中,这给了我一个整数值 0xFFFFFF16(在 2 的补码中为 -234)。 在另一个上,它给了我 0。 显然,代码是模棱两可的,这就是为什么它可以理解地不被认为是可移植的。

我知道你说你不想使用-Wconversion但它警告你关心的问题,至少在 g++ 4.5 中,在将long转换为unsigned long时不会发出警告(例如)。对于它警告您在哪里执行合法所需转换的任何其他情况,只需投射它即可。您未来的维护者将非常感谢您明确表示正在执行已知的转换,而不是从代码上下文中猜测它是否有意。

完成浮点到 int 的隐式转换时,截断的值无法适合目标类型,则行为是未定义的,正如您的示例很好地说明的那样。

如果 g++ 提供的唯一工具是 -Wconversion,也许你应该制作自己的工具来过滤警告以方便您(我想的是通常的 sedawkperlphp,但这取决于这些工具在您的系统上的可用性,如果您使用一个,也许您可以直接从您的 IDE 执行类似操作)。

您还可以使用 gcc 的特定编译指示指令来限制对特定文件甚至特定代码部分的转换检查。

用于在代码中查明发生有问题的转换的任何其他编程方法当然都可用于插入显式强制转换,这是您应该瞄准的目标。