gcc 的 -Wbad-function-cast 的目的是什么?

2024-05-04

根据此处答案的建议,我打开了-Wbad-function-cast看看我的代码是否有 gcc 可以捕获的任何不良行为,结果出现了这个示例:

unsigned long n;
// ...
int crossover = (int)pow(n, .14);

(这里并不重要crossover is an int;它可能是unsigned long并且消息是相同的)。

这看起来是一个非常普通且有用的强制转换示例。为什么这是有问题的?否则,是否有理由保持此警告打开?

我通常喜欢设置很多警告,但我无法全神贯注于这个警告的用例。我正在编写的代码是大量数字化的,并且很多时候,事物会根据需要从一种类型转换为另一种类型,以满足所涉及算法的不同需求。


你最好认真对待这个警告。

如果你想从 pow 的浮点结果得到整数,它是舍入操作,必须使用标准舍入函数之一来完成,例如round。使用整数转换来执行此操作可能会产生惊喜:您通常会丢失小数部分,例如2.76可能最终会变成2带有整数截断,就像2.12最终会变成2。即使您想要这种行为,您最好使用以下命令显式指定它:floor功能。这将提高代码的可读性和可支持性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc 的 -Wbad-function-cast 的目的是什么? 的相关文章

随机推荐