Почему GCC позволяет использовать round() в C++ даже с флагами ansi и pedantic?

StackOverflow https://stackoverflow.com/questions/1882689

  •  19-09-2019
  •  | 
  •  

Вопрос

Есть ли веская причина, по которой эта программа компилируется под 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.

Я вижу две проблемы:

  1. round() не должен быть доступен для C++ в режиме, совместимом с ISO (поскольку он взят из C99)
  2. Даже если round() были доступны в этом случае, это должно быть так только с std пространство имен

Я ошибаюсь?

Это было полезно?

Решение

Это ошибка.Это существует на удивление долго.Видимо, не хватило коллективного желания это исправить.Поскольку не за горами новая версия C++, которая будет использовать функции C99 из math.h, маловероятно, что эта проблема когда-либо будет исправлена.

Другие советы

Возможно, я ошибаюсь, но разве флаг -ansi gcc не применяется к конструкциям кода (т. е. отключить GCC язык расширения), а не переводить все библиотеки в режим строгой совместимости с ANSI?

Я считаю, что Стандарты определяют, какие символы необходимо определить и в каком заголовке они определяются.Я не считаю, что в Стандартах указано, что никакие другие символы не могут быть определены.Более того, std::round() не будет определяться свободным символом, называемым round() можно определить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top