- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
小心,我说的是::abs()
,而不是 std::abs()
根据cplusplus.com website , abs
stdlib.
的行为应该不同h C 版本,如果包含 <cmath>
这是此页面的摘录(涉及 ::abs
,而不是 std::abs
):
double abs (double x);
float abs (float x);
long double abs (long double x);
Compute absolute value
/*
Returns the absolute value of x: |x|.
These convenience abs overloads are exclusive of C++. In C, abs is only declared
in <cstdlib> (and operates on int values).
The additional overloads are provided in this header (<cmath>) for the integral types:
These overloads effectively cast x to a double before calculations
(defined for T being any integral type).
*/
真的???
在将程序移植到新平台时,我一直被这个问题困扰,因为不同的编译器和标准库的实现在这里有所不同。
这是我的示例程序:
#include <iostream>
//#include <stdlib.h>//Necessary inclusion compil under linux
//You can include either cmath or math.h, the result is the same
//#include <cmath>
#include <math.h>
int main(int argc, const char * argv[])
{
double x = -1.5;
double ax = std::abs(x);
std::cout << "x=" << x << " ax=" << ax << std::endl;
return 0;
}
这是 MSVC 2010 下的结果:
stdlib.h
,程序也会编译。 : 好像math.h
和 stdlib.h
无论您做什么,总是包含在其中x=-1.5 ax=1.5
(根据引用资料似乎是正确的)现在是 OSX 下的结果:
-Wall
,也不会发出编译警告标志(没有信号转换为 int 的 double )!如果替换g++
,结果是一样的由 llvm-g++
.纳入math.h
或 cmath
编译不需要。x=-1.5 ax=1
最后是Linux下的结果:
stdlib.h
,程序将无法编译。不包括在内(最后,一个不自动包括stdlib
的编译器)。对于 double -> int cast,不会发出编译警告。x=-1.5 ax=1
这里没有明确的赢家。我知道一个明显的答案是“更喜欢 std::abs
到 ::abs
”,但我想知道:
abs
应该自动提供 std
之外的双重版本命名空间?math.h
)?最佳答案
官方引用资料说……这是一团糟。 C++11 和 C11 之前的版本:
官方,包括<cmath>
::
中没有引入任何内容;所有的功能都在std::
.实际上,只有 export
不太受尊重,不同的编译器做得非常好不同的东西。如果您包括 <cmath>
,您使用了 std::
到处都是,或者你得到的东西因编译器而异。
C 没有提供任何重载:abs
拍了int
, 并且是在 <stdlib.h>
中声明, fabs
拍了double
, 并且是在 <math.h>
中声明.
如果包含 <math.h>
在 C++ 中,不清楚你是什么得到了,但由于似乎没有一个实现者关心无论如何都是标准(参见上面的第一点)......
粗略地说,要么包括<cmath>
, 和前缀std::
的所有用途, 或者您包括 <math.h>
, 和使用 fabs
如果您想要支持浮点(以及int
以外的类型的各种后缀或 double
)。
C++11 和 C11 增加了一些新的变化:
<cmath>
现在允许(但不是必须)引入::
中的符号也是。还有一件事可能会有所不同取决于实现。 (这里的目标是使符合现有实现。)
C 有一个新的头文件,<tgmath.h>
,它使用编译器魔法来制作<math.h>
中的函数表现得好像他们是在 C++ 中重载。 (所以它不适用于 abs
,但仅适用于至fabs
.) 这个头文件没有被添加到 C++ 中,因为C++ 不需要任何编译器魔法的明显原因这个。
总而言之,情况变得稍微糟糕了,我的上述建议仍然有效。包括<math.h>
和 <stdlib.h>
, 并使用 abs
/fabs
及其衍生物(例如 labs
, fabsf
, 等等) 排他地, 或包括 <cmath>
, 和使用 std::abs
只。其他任何事情,你都会遇到便携性问题。
关于c++ - abs vs std::abs,引用说明了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21392627/
我是一名优秀的程序员,十分优秀!