Ответ 1
std::round
- это С++ 11, поэтому вам нужно будет скомпилировать с помощью -std=c++0x
или использовать round
без std
.
Я пытаюсь скомпилировать этот код:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
Но GCC говорит мне:
error: 'round' is not a member of 'std'
Я знаю, что раньше я использовал функцию round
в ISO С++ 98. Необычно, round
и ::round
работают.
Что дает?
Обновление: я компилировался с помощью g++ -std=c++98 -Wall -pedantic
.
Переход на std=c++0x
работает.
Но почему работают неквалифицированные/анонимные round
и ::round
, если std::round
не работает?
std::round
- это С++ 11, поэтому вам нужно будет скомпилировать с помощью -std=c++0x
или использовать round
без std
.
Я провел немного исследований, вот что я нашел:
round
определяется в ISO С++ 11, так как он содержит стандартную библиотеку ISO C99.
round
не входит в ISO С++ 98, который использует стандартную библиотеку ISO C90.
Вот почему это не в пространстве имен std
для С++ 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 разрешает использование round() в С++ даже с флагами ansi и pedantic?
Другие компиляторы С++ могут не предоставлять функцию round
(поскольку она не требуется стандартом), поэтому я должен определить свой собственный.
старой теме, но, возможно, полезно для поиска в 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);
В стандарте С++ 03 нормативная ссылка для стандартной библиотеки C - ISO/IEC 9899: 1990 (C90), которая не включает функцию round
. В С++ 11 это ISO/IEC 9899: 1999 (C99), который включает в себя функцию round
.
Содержимое <cmath>
в каждом стандарте С++ совпадает с math.h
из соответствующей стандартной библиотеки C, за исключением нескольких изменений (§26.8/4 в С++ 11):
Содержимое этих заголовков [
<cmath>
и<cstdlib>
] совпадает с заголовками библиотеки стандартного C<math.h>
и<stdlib.h>
соответственно [...]
Они, однако, находятся в области пространства имен std
(§17.6.1.2/4 в С++ 11):
Однако в стандартной библиотеке С++ декларации (за исключением имен, которые определены как макросы в C) находятся в области пространства имен (3.3.6) пространства имен std.
Итак, чтобы его завершить, функция round
недоступна в С++ 03, поэтому скомпилируйте ее с опцией -std=c++0x
и обратитесь к ней как std::round
.
как насчет
float myRoundFunc(float toRound)
{
return std::ceil(toRound - 0.5);
}
Таким образом, нет никакого сравнения, и оно будет округлено должным образом.