Почему 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.

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

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

Я ошибся?


person Dan Moulding    schedule 10.12.2009    source источник


Ответы (3)


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

person Dan Moulding    schedule 12.12.2009

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

person Timo Geusch    schedule 10.12.2009
comment
на странице руководства по gcc указано, что некоторая функция не будет определена, когда установлен флаг ansi, но не то, что будут определены только функции ansi - person josefx; 10.12.2009
comment
@josefx: См. мои комментарии Д. Шоули. Изучив больше, я узнал, что расширения библиотеки не могут изменить поведение правильно сформированных программ. Мне кажется, что добавление расширения round() в библиотеку было бы незаконным, что делает поведение флага -ansi спорным. - person Dan Moulding; 10.12.2009

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

person D.Shawley    schedule 10.12.2009
comment
Хорошо, это может быть правдой, но цель -ansi, согласно руководству GCC, состоит в том, чтобы отключить все нестандартные расширения. Любые такие дополнительные библиотечные функции были бы расширениями стандарта (разрешены ли такие расширения стандартом, не имеет отношения к этому вопросу). - person Dan Moulding; 10.12.2009
comment
Я должен исправить свой предыдущий комментарий: -ansi отключает конфликтующие расширения, а -pedantic должен отключать все расширения. - person Dan Moulding; 10.12.2009
comment
Фактически, я рассмотрел стандарты C и C ++, и, хотя они допускают дополнительные библиотечные функции, такие расширения не могут изменить поведение любой правильно сформированной программы. Это означает, что они не могут зарезервировать какие-либо дополнительные идентификаторы (т.е. правильно сформированная программа, определяющая свою собственную функцию round (), будет нарушена библиотекой, расширяющей стандарт своей собственной функцией round). Любые дополнительные библиотечные функции должны иметь имена, которые уже зарезервированы, например _Round(). - person Dan Moulding; 10.12.2009