Pourquoi GCC permet l'utilisation de round () en C ++, même avec les drapeaux ansi et pédant?

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

  •  19-09-2019
  •  | 
  •  

Question

Y at-il une bonne raison pour laquelle ce programme compile sous GCC même avec les drapeaux -ansi et -pedantic?

#include <cmath>

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

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

compile propre (aucun avertissement, même) avec g++ -ansi -pedantic -Wall test.cpp -o test.

Je vois deux problèmes:

  1. round() ne devrait pas être disponible pour C ++ en mode ISO-conforme (car il vient de C99)
  2. Même si round() étaient disponibles dans ce cas, il ne devrait être donc de l'espace de noms std

Ai-je tort?

Était-ce utile?

La solution

C'est un bug . Il a été autour pendant un certain temps étonnamment longue. Apparemment, il n'y a pas eu assez d'une volonté collective de le fixer. Avec une nouvelle version de C ++ juste autour du coin qui adoptera les fonctions C99 de math.h, il semble peu probable qu'il ne sera jamais fixé.

Autres conseils

Je pourrais être hors de la base ici, mais ne s'applique drapeau -ansi de ne pas gcc aux constructions de code (par exemple, désactiver GCC langue extensions) plutôt que de passer toutes les bibliothèques en mode compatible stricte ANSI ainsi?

Je crois que les normes précisent quels symboles doivent être définis et dans lequel ils sont définis en-tête. Je ne crois pas que l'état des normes qu'aucun autre symboles peuvent être définis. Plus au point, std::round() ne sera pas défini par un symbole gratuit appelé round() peut être défini.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top