C++ g++;未使用-Wconversion将双精度/浮点转换为无符号整数时发出警告

C++ g++;未使用-Wconversion将双精度/浮点转换为无符号整数时发出警告,c++,c,g++,C++,C,G++,可能重复: 根据这个问题,从double/float到无符号整数的直接转换是不可移植的。我发现在我的代码中有一些情况会发生这种情况,我想告诉g++在发生这种情况时警告我,但我找不到这样的选项。有人知道是否有这样的选择吗 注意:我确实看到了-Wconversion,但这也警告了我不关心的所有其他类型的转换(例如将int转换为无符号int,这在标准中是可移植的) 编辑:下面是一个代码示例,我希望看到一个警告: double dblNumber = -234; unsigned long uintN

可能重复:

根据这个问题,从double/float到无符号整数的直接转换是不可移植的。我发现在我的代码中有一些情况会发生这种情况,我想告诉g++在发生这种情况时警告我,但我找不到这样的选项。有人知道是否有这样的选择吗

注意:我确实看到了-Wconversion,但这也警告了我不关心的所有其他类型的转换(例如将int转换为无符号int,这在标准中是可移植的)

编辑:下面是一个代码示例,我希望看到一个警告:

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

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

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

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

如果g++提供的唯一工具是-Wconversion,那么为了方便起见,您可能应该制作自己的工具来过滤警告(我想使用通常的sed、awk、perl或php,但这取决于系统上这些工具的可用性,如果您使用IDE,您可以直接从IDE中执行类似的操作)

您还可以使用gcc将转换检查限制为特定文件,甚至特定代码部分


任何其他用于在代码中指出发生问题转换的编程方法都可以用来插入显式转换,这是您应该达到的目标。

@djechlin:“注意:我确实看到了-Wconversion,但这也警告了我不关心的所有其他类型的转换(例如,将int转换为无符号int,这在标准中是可移植的)。”。我承认我没有看到其他问题,但它并没有真正解决不使用-Wconversion的问题。我觉得奇怪的是,默认情况下,它没有对此发出警告,特别是因为不同版本的g++会做出不同的反应,导致某些实现以静默方式失败。@KdawgUD您能展示一段示例代码吗?不确定您是如何执行conversion。当您显式地从一种类型强制转换为另一种类型时,例如
unsigned\u int\u value=(unsigned int)double_value;
您正在告诉编译器我知道我在做什么。所以我不明白编译器为什么会对此类转换发出警告。事实上,如果有警告,显式强制转换将禁止任何警告。除非我误解了您的问题,否则您所问的是不可能的。@Griwes这就是为什么我要求OP post发布一些代码,以了解具体情况完成了。因为OP已经声明了
-Wconversion
没有检测到这一点,所以我想不出任何其他关于转换是如何完成的。@KingsIndian,哦,对不起,时间戳读取失败。我100%同意显式转换更好。我只是希望找到一种方法来设置我的构建系统,以便在我错误地执行隐式doubl时对于我的项目来说,-Wconversion产生的警告太多了,不幸的是,这些警告没有用处。