Почему GCC позволяет использовать round() в C++ даже с флагами ansi и pedantic?
Вопрос
Есть ли веская причина, по которой эта программа компилируется под GCC даже с -ansi
и -pedantic
флаги?
#include <cmath>
int main (int argc, char *argv [])
{
double x = 0.5;
return static_cast<int>(round(x));
}
Это компилируется чисто (даже без предупреждений) с g++ -ansi -pedantic -Wall test.cpp -o test
.
Я вижу две проблемы:
round()
не должен быть доступен для C++ в режиме, совместимом с ISO (поскольку он взят из C99)- Даже если
round()
были доступны в этом случае, это должно быть так только сstd
пространство имен
Я ошибаюсь?
Решение
Это ошибка.Это существует на удивление долго.Видимо, не хватило коллективного желания это исправить.Поскольку не за горами новая версия C++, которая будет использовать функции C99 из math.h, маловероятно, что эта проблема когда-либо будет исправлена.
Другие советы
Возможно, я ошибаюсь, но разве флаг -ansi gcc не применяется к конструкциям кода (т. е. отключить GCC язык расширения), а не переводить все библиотеки в режим строгой совместимости с ANSI?
Я считаю, что Стандарты определяют, какие символы необходимо определить и в каком заголовке они определяются.Я не считаю, что в Стандартах указано, что никакие другие символы не могут быть определены.Более того, std::round()
не будет определяться свободным символом, называемым round()
можно определить.