2014-09-29 238 views
0

当我与OSX 10.8,并且不产生警告克++ 4.2.1编译的Mac 64位机器上下面的代码时不警告。降级双浮动

#include "stdio.h" 

int main() 
{ 
    double d= 3.14159; 
    float res= d; 
    printf("%f\n", res); 
    return 0; 
} 

显然,自动将双精度降为浮点值可能非常危险,但编译器不会生成任何警告。我能找到的唯一解决办法是使用标志-Wshorten 64至32

在我看来,这样一个明显的错误,我很惊讶,编译器默认情况下不抓住这个错误。有什么理由为什么g ++默认不会捕获这个错误?有没有更好的方式来产生,而无需使用-Wshorten 64至32的警告?

如果你想知道,-Wall不会产生任何警告...

感谢您对您的帮助提前。

+2

真实似乎是“为什么GNU/g ++不应用-Wshorten-64-to-32默认或作为-Wall的一部分?”我不相信这有一个好的答案。只需在项目中启用此类功能并继续。 (在C/C++中有许多东西我会*要求*警告或彻底禁止,但是我会编写一个[衍生语言]的编译器,拒绝大量带默认设置的代码..) – user2864740 2014-09-29 03:17:22

+1

请求降级编写** float ** res = d;如果编译器对此提出警告,我会认为它很烦人。 – 2014-09-29 03:28:41

+0

很多这一点归结为开发社区的长期经验......如果许多有经验的程序员被这样的意外转换所困扰,首先GCC可能会将警告作为“-Wall”的一部分,然后有人会可能会建议对标准进行修改等等。事实上,它没有被警告过,这表明很少有人看到你的“潜在的非常危险”有很多实质性的东西。标准允许许多类似危险的转换,总而言之,它们证明更加方便麻烦。 – 2014-09-29 04:29:57

回答

1

的行为根据标准:

4.8浮点转换[conv.double]

浮点类型的prvalue可以被转换成另一种浮点类型的prvalue 。如果 源值可以在目标类型来精确表示,所述转换的结果是,确切 表示。如果源值是两个相邻的目的地值之间,转换 的结果是实现定义的选择的任一那些值的。否则,行为是不确定的。

此外,值浮点类型可以转换为整数类型的值:

4.9浮动积分转换[conv.fpint]

浮点类型的prvalue可以转换为整数类型的prvalue。转换截断; 即小数部分被丢弃。如果截断的值不能是目标类型中表示的 ,则行为未定义。

+0

尽管这是真的,但这并没有讨论为什么g ++不是更多的默认警告。 (当然,我不认为*这个问题有个很好的答案..) – user2864740 2014-09-29 03:16:18

+0

@ user2864740同意,答案并不涉及G ++的警告策略。但它也不完全不相关。不知道,也许我应该删除它:)。 – AlexD 2014-09-29 03:20:41

+0

不,我认为没关系(我也投了票) - 有这样的信息是很好的。只是指出我相信OP正在寻找更多的g ++ /实现特定的基本原理。 – user2864740 2014-09-29 03:21:49