g++ -Wall 没有关于 double-> int cast 的警告

Posted

技术标签:

【中文标题】g++ -Wall 没有关于 double-> int cast 的警告【英文标题】:g++ -Wall not warning about double-> int cast 【发布时间】:2011-04-05 14:01:47 【问题描述】:

在下面的 sn-p 中不会产生任何警告。 g++4.4.3 -Wall -pedantic

//f is
void f(int );

f(3.14);
double d = 3.14;
int i = d+2;

我强烈记得这是一个警告,类似于“可能丢失精度”。是被删除了还是我的记忆在欺骗我?

如何在 g++ 中将其变成警告?我觉得这是一个有用的警告,还是一个坏主意?

我什至在http://gcc.gnu.org/onlinedocs/gcc-4.4.5/gcc/Warning-Options.html 找不到合适的东西

【问题讨论】:

【参考方案1】:
$ gcc -Wconversion test.c

test.c: In function ‘main’:
test.c:3: warning: conversion to ‘int’ from ‘double’ may alter its value

【讨论】:

是的,这可以解决问题。我觉得很奇怪,它没有包含在 -Wall 中。 它会导致数百个与整数相关的转换警告,这就是为什么在-Wall 中未启用它的原因。也许使用gcc.gnu.org/bugzilla/show_bug.cgi?id=53001 会更简单。【参考方案2】:

使用-Wconversion 选项。 -Wall 不包括它。

使用-Wconversion 选项,GCC 会给出以下警告消息:

警告:转换为 'int' 会改变 'double' 常量值 警告:从 'double' 转换为 'int' 可能会改变其值

【讨论】:

【参考方案3】:

除了其他答案提到的之外,还值得一提的是,在 C++0x 中 初始化并没有缩小。因此,例如,您不会收到警告,而是会收到错误

void f(int x)

   // code


int main()

   f(3.14); // narrowing conversion of '3.14000000000000012434497875801753252744674682617e+0' from 'double' to 'int' inside  

g++ 4.4 及以上支持初始化列表(带有-std=c++0x 选项)

【讨论】:

以上是关于g++ -Wall 没有关于 double-> int cast 的警告的主要内容,如果未能解决你的问题,请参考以下文章

haskell中的Double for循环

关于C++ typedef list<类名>:iterator iterator;出错

qt5中QVector<double> 如何赋值

关于double和float的包装类Double和Float代码如下 Double d1 = 1.0;Double d2 = 1.0;

Visifire图表

使用 std::count_if() 时出现错误“没有从 'std::vector<double, std::allocator<double> >' 到 'double *'