有没有gcc标志可以捕获整数截断?

6

有没有一个 gcc标志可以在我尝试将double值放入int变量时发出警告/错误信号?我目前设置了-Wall -Wextra -Werror,但当我(例如)将double传递给int参数时,仍然不会收到任何警告,即使我正在丢失信息。

2个回答

9
你可以使用 -Wconversion 选项。来自GCC手册的提示:警告可能会更改值的隐式转换,包括实数和整数之间的转换,例如当x是double时的abs(x),有符号和无符号之间的转换,例如unsigned ui = -1;以及向较小类型的转换,例如sqrtf (M_PI)。不要警告显式转换,例如abs ((int) x)和ui = (unsigned) -1,或者如果该值未被转换更改,例如在abs(2.0)中。使用-Wno-sign-conversion可以禁用有关有符号和无符号整数之间的转换的警告。

这是截至GCC 4.8.2的状态,而从GCC 4.9.0开始,您也可以使用-Wfloat-conversion进行相同的操作。


这并不理想。它还会引发有关有符号/无符号转换的警告,这与截断无关,而且我也不需要。希望有一个仅用于截断的标志。 - Penghe Geng
你尝试过使用-Wfloat-conversion吗?这正是@unwind的回答所建议的。 - legends2k
1
@PengheGeng,您可以通过添加“-Wno-sign-conversion”来获得截断。然而,“-Wconversion”在我看来似乎仍然是无用的,因为它还会警告显式转换,所以基本上禁止了所有向较小类型的强制转换。它还会警告字面值的隐式转换,因此“my_u8 += 1”是一个错误,因为“1”是一个“int”。 - Brendan

3

使用-Wfloat-conversion选项:

-Wfloat-conversion

警告隐式转换会降低实值的精度。这包括从实数到整数的转换,以及从高精度实数到低精度实数的转换。此选项也由-Wconversion启用。


我认为这仅适用于浮点值的精度损失,它会对_double转换为int发出警告吗? - legends2k
@legends2k 我现在没有测试过,但我认为我引用的措辞已经足够清晰了(floatdouble都是“实数”)。 - unwind
我在Coliru上也无法让它工作,我建议只使用“-Wconversion”。 - Shafik Yaghmour
当我将-Wfloat-conversion传递给gcc时,出现了“未识别的选项”,它可能已被替换为-Wconversion - Sean Kelleher
GCC 4.8.2手册中没有,但在即将发布的4.9.0版本中会有。这是错误页面,证实了在4.9中添加此选项。 - legends2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接