【发布时间】:2018-12-20 15:08:09
【问题描述】:
我将一些代码从 windows (vs2010) 移植到 gcc
它的一部分看起来像:
double r1 /* = some value */;
double r2 /* = some value */;
double diff = abs(r1-r2);
std::cerr<< r1 << ", " << r2 << ", " << diff<< std::endl;
它在 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
在 Windows 上,结果是正确的。 abs 函数存在双重重载。
我不是using namespace std;。似乎在 gcc 下这些重载在全局命名空间中不存在。
我不知道标准到底是什么意思,但我预计至少会在将差异传递给abs 函数时发出关于双->int 转换的警告。
我有什么遗漏吗?为什么我没有收到此警告?
【问题讨论】:
-
在 C++ 中没有关于隐式转换的警告。对于整数值,
abs没有重载,请考虑使用fabs(如果您出于某种原因希望避免使用 STL。 -
en.cppreference.com/w/c/numeric/math/abs 您可能想在
abs之前输入std::。 -
很有趣,如果您使用
#include <math.h>而不是<cmath>它可以正常工作。显然math.h将所有内容都带入了全局命名空间,而cmath则选择性地带来了单个重载。呵呵。 -
@bipll 是的,这是错误的,因为使用 vs2010 确实存在过载我得到了错误的结果 - 但主要问题是,为什么 gcc 不会警告转换 - 即使使用
-Wall和-Wextra -
gcc 在可靠警告方面远不如 clang。