题
我尝试编译这段代码:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
但海湾合作委员会告诉我:
error: 'round' is not a member of 'std'
我知道我用过 round
函数多次在 ISO C++98 前。不同寻常的是, round
和 ::round
两者都有效。
是什么赋予了?
更新:我正在编译 g++ -std=c++98 -Wall -pedantic
。切换到 std=c++0x
作品。
但为什么不合格/匿名的人 round
和 ::round
两者都有效,如果 std::round
不是吗?
解决方案
这 std::round
函数是 C++11,因此您需要使用 C++11 或启用的更新标准进行编译。
其他提示
我做了一些研究,这是我发现的:
round
定义于 ISO C++11, ,因为它包含 ISO C99 标准库。
round
不属于 ISO C++98, ,它使用 ISO C90 标准库。
这就是为什么它不在命名空间中 std
为了 C++98.
但 g++
是(错误地)包括 C99 标头,即使使用编译 -std=c++98 -pedantic
, ,这应该禁用所有非标准的东西:
GNU_SOURCE 由 G++ 定义并且...这意味着 _USE_ISOC99
(从 http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)
这就是为什么 ::round
作品。
这显然是 GCC 中的一个错误: 为什么 GCC 允许在 C++ 中使用 round(),即使带有 ansi 和 pedantic 标志?
其他 C++ 编译器可能不提供 round
函数(因为标准不要求它),所以我应该定义自己的。
怎么样
float myRoundFunc(float toRound)
{
return std::ceil(toRound - 0.5);
}
这样就没有比较,并且会正确舍入。
老话题,但可能对在谷歌搜索的人有用:
//TODO: C++11 got round() function defined in math.h
float distance = sqrt((float)(plus_x * plus_x + plus_y * plus_y));
if (distance >= floor(distance)+0.5) distance = ceil(distance);
else distance = floor(distance);
在 C++03 标准中,规范性参考 标准C库 是 ISO/IEC 9899:1990 (C90),其中 才不是 包括 round
功能。在 C++11 中,它是 ISO/IEC 9899:1999 (C99),它 做 包括 round
功能。
的内容 <cmath>
每个 C++ 标准中的内容都相同 math.h
来自相应的标准 C 库,除了一些更改(C++11 中的§26.8/4):
这些标头的内容 [
<cmath>
和<cstdlib>
] 与标准 C 库头相同<math.h>
和<stdlib.h>
分别 [...]
然而,它们在命名空间范围内 std
(C++11 中的第 17.6.1.2/4 节):
然而,在 C++ 标准库中,声明(除了在 C 中定义为宏的名称)位于命名空间 std 的命名空间范围 (3.3.6) 内。
所以,总结一下, round
函数在 C++03 中不可用,因此使用 -std=c++0x
选项并将其称为 std::round
.