我正在尝试编译此代码:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
但海湾合作委员会告诉我:
error: 'round' is not a member of 'std'
我知道我之前在 ISO C ++ 98 中多次使用过round
函数。不同寻常的是,round
和::round
都有效。
是什么给出了?
更新:我正在使用g++ -std=c++98 -Wall -pedantic
进行编译。
切换到std=c++0x
有效。
但是,如果round
没有,那么为什么不合格/匿名的::round
和std::round
都有效?
答案 0 :(得分:15)
std::round
函数是C ++ 11,因此您需要使用C ++ 11或更新的标准进行编译。
答案 1 :(得分:12)
我做了一些研究,这是我发现的:
round
在 ISO C ++ 11 中定义,因为它包含 ISO C99 标准库。
round
不属于 ISO C ++ 98 ,它使用 ISO C90 标准库。
这就是为什么 C ++ 98
不在命名空间std
中。
但是g++
(错误地)包括 C99 标题,即使使用-std=c++98 -pedantic
进行编译时也应该禁用所有非标准内容:
GNU_SOURCE由G ++定义,它意味着_USE_ISOC99
(来自http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)
这就是::round
有效的原因。
这显然是海湾合作委员会的一个错误:Why does GCC allow use of round() in C++ even with the ansi and pedantic flags?
其他C ++编译器可能不提供round
函数(因为它不是标准所要求的),所以我应该定义自己的函数。
答案 2 :(得分:5)
怎么样
float myRoundFunc(float toRound)
{
return std::ceil(toRound - 0.5);
}
这种方式没有比较,它会正确地圆整。
答案 3 :(得分:4)
旧主题,但对于在Google中搜索的内容可能很有用:
//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);
答案 4 :(得分:3)
在C ++ 03标准中,标准C库的规范性引用是ISO / IEC 9899:1990(C90),其中不包含{ {1}}功能。在C ++ 11中,它是ISO / IEC 9899:1999(C99), 包含round
函数。
每个C ++标准中round
的内容与相应标准C库中的<cmath>
相同,除了一些更改(C ++ 11中的第26.8 / 4节):
这些标题[
math.h
和<cmath>
]的内容分别与标准C库标题<cstdlib>
和<math.h>
相同[...]
然而,它们在<stdlib.h>
的命名空间范围内(C ++ 11中的第17.6.1.2 / 4节):
但是,在C ++标准库中,声明(在C中定义为宏的名称除外)在命名空间std的命名空间范围(3.3.6)内。
因此,为了将其包装起来,std
函数在C ++ 03中不可用,因此使用round
选项进行编译并将其称为-std=c++0x
。