【问题标题】:g++ warn when double/float is converted to unsigned integer without using -Wconversion [duplicate]g++ 在不使用 -Wconversion 的情况下将 double/float 转换为无符号整数时发出警告 [重复]
【发布时间】:2012-11-24 23:44:13
【问题描述】:

可能重复:
g++ -Wall not warning about double-> int cast

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

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

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

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

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

【问题讨论】:

  • @djechlin: "注意:我确实看到了 -Wconversion,但这也警告了我不关心的各种其他转换(例如将 int 转换为 unsigned int,即根据标准可移植)。”.
  • 我承认我没有看到其他问题,但它并没有真正解决不使用 -Wconversion 的问题。很奇怪,默认情况下我没有对此发出警告,特别是因为不同版本的 g++ 反应不同,导致某些实现静默失败。
  • @KdawgUD 你能展示一段示例代码吗?不确定您是如何进行转换的。每当您从一种类型显式转换为另一种类型时,例如un_signed_int_value=(unsigned int) double_value;,您就是在告诉编译器我知道我在做什么。所以我不明白为什么编译器会警告这种转换。事实上,如果有警告,显式强制转换会抑制任何警告。除非我误解了你的问题,否则你的问题是不可能的。
  • @Griwes 这就是为什么我要求 OP 发布一些代码来看看它是如何完成的。由于 OP 已经声明 -Wconversion 没有检测到这一点,我想不出关于转换是如何完成的其他任何事情。
  • @KingsIndian,哦,对不起,时间戳读取失败。

标签: c++ c g++


【解决方案1】:

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

【讨论】:

  • 我 100% 同意显式转换更好。我只是希望找到一种方法来设置我的构建系统,这样如果我错误地将隐式双精度转换为无符号转换,它就不会从裂缝中溜走而被忽视。不幸的是,对于我的项目,-Wconversion 产生的警告太多而无用。
【解决方案2】:

float 到 int 隐式转换完成,并且截断的值不适合目标类型时,则行为未定义,正如您的示例很好地说明了它。

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

您还可以使用 gcc 的specific pragma directives 将转换检查限制在特定文件,甚至特定代码部分。

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

【讨论】:

    猜你喜欢
    • 2014-08-31
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    相关资源
    最近更新 更多