Cha*_*les 6 gcc warnings compiler-warnings
正如这里的答案所建议的那样,我转过头来-Wbad-function-cast看看我的代码是否有任何gcc可以捕获的不良行为,并且它出现了这个例子:
unsigned long n;
// ...
int crossover = (int)pow(n, .14);
Run Code Online (Sandbox Code Playgroud)
(这不是关键在这里,crossover是int,它可能是unsigned long该消息将是相同的).
这似乎是一个非常普通和有用的演员的例子.为什么这有问题?否则,是否有理由保持此警告开启?
我一般都喜欢设置很多警告,但我无法围绕这个用例.我正在处理的代码是大量的数字,并且很多时候根据需要将事物从一种类型转换为另一种类型以满足所涉及的算法的不同需求.
你最好认真对待这个警告.
如果你想从pow的浮点结果得到整数,那就是舍入操作,必须用标准的舍入函数之一来完成round.使用整数转换执行此操作可能会产生意外情况:您通常会丢失小数部分,例如,2.76最终可能会像2整数截断一样2.12结束,就像最终一样2.即使您想要这种行为,也最好使用floor函数明确指定它.这将提高代码的可读性和可支持性.
警告的效用-Wbad-function-cast是有限的。
-Wall既没有也没有启用该警告可能并非巧合-Wextra。它不适用于 C++(仅适用于 C/Objective-C)。
您的具体示例不会利用未定义的行为或实现定义的行为(参见 ISO C11,第 6.3.1.4 节)。因此,此警告给您带来的好处为零。
相反,如果您尝试重写代码以取悦-Wbad-function-cast您,则只需添加多余的函数调用,即使是最新的GCC/Clang 编译器也不会对其进行优化-O3:
#include <math.h>
#include <fenv.h>
int f(unsigned n)
{
int crossover = lrint(floor(pow(n, .14)));
return crossover;
}
Run Code Online (Sandbox Code Playgroud)
(反面例子,没有发出警告,-Wbad-function-cast但有多余的函数调用)
| 归档时间: |
|
| 查看次数: |
1334 次 |
| 最近记录: |