20

我正在尝试编译这段代码:

#include <cmath>
double gravity (double level) {
    return 0.02 * std::round(level);
}

但 GCC 告诉我:

error: 'round' is not a member of 'std'

我知道我之前在ISO C++98round中多次使用过这个函数。不同寻常的是,两者都有效。round::round

是什么赋予了?

更新:我正在编译g++ -std=c++98 -Wall -pedantic。切换到std=c++0x作品。

但是为什么不合格/匿名round::round两者都工作,如果std::round没有呢?

4

5 回答 5

17

这些std::round函数是 C++11,因此您需要使用 C++11 或启用的更新标准进行编译。

于 2012-10-02T19:18:03.527 回答
13

我做了一些研究,这是我发现的:

roundISO C++11中定义,因为它包含ISO C99标准库。

round不是使用ISO C90标准库的ISO C++98的一部分。

这就是为什么它不在C++98std的命名空间中。

但是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函数(因为它不是标准要求的),所以我应该定义自己的。

于 2012-10-02T20:29:28.303 回答
6

怎么样

float myRoundFunc(float toRound)
{
  return std::ceil(toRound - 0.5);
}

这样就没有比较,它会正确地四舍五入。

于 2014-05-13T18:46:13.023 回答
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);
于 2014-04-06T23:45:05.923 回答
4

在 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.

于 2012-10-02T19:32:25.483 回答