我从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转换的警告。
我错过了什么吗?为什么我没有收到此警告?
答案 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.