gcc对abs功能的奇怪行为

时间:2018-12-20 15:08:09

标签: c++ gcc

我从Windows(vs2010)移植了一些代码到gcc

其中的一部分看起来像:

double r1 /* = some value */;
double r2 /* = some value */;
double diff = abs(r1-r2);
std::cerr<<  r1 << ", " << r2 << ", " << diff<< std::endl;

它使用-Wall -Wextra在gcc(arm-linux-gnueabihf-g ++(Raspbian 6.3.0-18 + rpi1 + deb9u1)6.3.0 20170516)上编译而没有警告。

结果是:

0.121, 0.0709839, 0
0.015, 0.131958, 0
0.015, 0.00799561, 0
0.21, 0.00799561, 0
0.182, 0.205994, 0
0.015, 0.00799561, 0

在Windows上,结果是正确的。 abs函数有双重过载。

我不是using namespace std;。在gcc下,这些重载似乎在全局名称空间中不存在。

我不知道标准到底是什么,但是我希望至少在将差值传递给abs函数时出现关于double-> int转换的警告。

我错过了什么吗?为什么我没有收到此警告?

2 个答案:

答案 0 :(得分:10)

abs是一个C函数,它使用一个整数并返回另一个整数。

您想使用C ++版本std::abs。 Clang实际上会警告该错误(我甚至将其转化为错误-Werror=absolute-value),不确定gcc是否存在类似的标志(不是警告所有转换,仅警告abs)。

答案 1 :(得分:4)

我认为您正在寻找编译器选项-Wfloat-conversion,或更笼统的-Wconversion。然后g ++给了我这个警告:

 warning: conversion to ‘int’ from ‘double’ may alter its value [-Wfloat-conversion]
     double diff = abs(r1-r2);

-Wall-Wextra中不包含两个选项。

只要转换包含在您的代码中,它就可以工作,请参见here.