2009-12-10 6 views
6

¿Hay una buena razón por la cual este programa compila bajo GCC incluso con los indicadores -ansi y -pedantic?¿Por qué GCC permite el uso de round() en C++ incluso con las banderas ansi y pedantic?

#include <cmath> 

int main (int argc, char *argv []) 
{ 
    double x = 0.5; 

    return static_cast<int>(round(x)); 
} 

Esto compila limpias (no hay advertencias, incluso con g++ -ansi -pedantic -Wall test.cpp -o test).

veo dos problemas:

  1. round() no debería estar disponible a C++ en el modo ISO-conformes (ya que proviene de C99)
  2. Incluso si round() estaban disponibles en este caso, sólo se debe sea ​​tan del std namespace

¿Es incorrecto?

Respuesta

2

This is a bug. Ha existido por un tiempo sorprendentemente largo. Aparentemente, no ha habido suficiente deseo colectivo de solucionarlo. Con una nueva versión de C++ a la vuelta de la esquina que adoptará las funciones C99 de math.h, parece poco probable que alguna vez se solucione.

0

que podría estar fuera de base aquí, pero no marca -ansi de gcc aplicará a las construcciones de código (es decir, desactivar GCC idioma extensiones) en lugar de cambiar todas las bibliotecas en modo compatible con ANSI estricta así?

+0

la página man para gcc indica que alguna función no se definirá cuando se establezca el indicador ansi, pero no que solo se definan las funciones ansi – josefx

+0

@josefx: vea mis comentarios a D. Shawley. Después de investigar más, descubrí que las extensiones de la biblioteca no pueden "alterar el comportamiento de los programas bien formados". Por lo tanto, me parece que añadir una extensión 'round()' a la biblioteca sería ilegal, lo que hace que el comportamiento del indicador '-ansi' sea discutible. –

-1

Creo que las Normas especifican qué símbolos se deben definir y en qué encabezado se definen. No creo que las Normas establezcan que no se pueden definir otros símbolos. Más al punto, std::round() no se definirá por un símbolo gratuito llamado round() se puede definir.

+0

Bien, eso puede ser cierto, pero el propósito de '-ansi', de acuerdo con el manual de GCC, es * deshabilitar * todas las extensiones no estándar. Cualquiera de esas funciones adicionales de la biblioteca serían extensiones del estándar (si tales extensiones son permitidas por el estándar es tangencial a esta pregunta). –

+0

Debo modificar mi comentario anterior: '-ansi' deshabilita * extensiones en conflicto *, mientras que' -pedantic' se supone que deshabilita todas las extensiones. –

+2

En realidad, he analizado los estándares C y C++ y, aunque permiten funciones de biblioteca adicionales, dichas extensiones no pueden "alterar el comportamiento de ningún programa bien formado". Esto implica que no pueden reservar ningún identificador adicional (es decir, un programa bien formado que define su propia función round() se rompería por la biblioteca extendiendo el estándar con su propia función de redondeo). Cualquier función de biblioteca adicional debe tener nombres que * ya * están reservados, como '_Round()'. –

Cuestiones relacionadas