gcc在abs函数上的奇怪行为

vla*_*sch 8 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;
Run Code Online (Sandbox Code Playgroud)

它编译在gcc(arm-linux-gnueabihf-g ++(Raspbian 6.3.0-18 + rpi1 + deb9u1)6.3.0 20170516),-Wall -Wextra没有任何警告.

结果是:

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
Run Code Online (Sandbox Code Playgroud)

在Windows上,结果是正确的.功能有双重载荷abs.

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

我不知道标准究竟是什么意思,但我希望至少有关于将差异传递给abs函数的double-> int-conversion的警告.

我错过了什么吗?为什么我没有得到这个警告?

Mat*_*her 10

abs 是一个C函数,它接受一个整数并返回另一个整数.

您想要使用C++版本std::abs.Clang实际上会警告这个错误(我甚至把它变成了一个错误-Werror=absolute-value),不确定gcc是否有类似的标志(不是警告所有的转换,只是为了abs).


Pat*_*tes 4

我认为您正在寻找编译器选项-Wfloat-conversion,或者更一般地说,-Wconversion. 然后 g++ 给了我这个警告:

\n\n
 warning: conversion to \xe2\x80\x98int\xe2\x80\x99 from \xe2\x80\x98double\xe2\x80\x99 may alter its value [-Wfloat-conversion]\n     double diff = abs(r1-r2);\n
Run Code Online (Sandbox Code Playgroud)\n\n

-Wall或中不包含这两个选项-Wextra

\n\n

只要转换在您的代码中,它就可以工作,请参阅此处。

\n