2016-04-12 4 views
5

Il semble que sur certains logiciels/compilateurs, la fonction pow() fonctionne sans aucune bibliothèque mathématique. Seulement avec <iostream>. Mais dans d'autres, il se plaint. Des fonctions mathématiques ont-elles été ajoutées à la bibliothèque <iostream> ou à un autre endroit?Fonction pow() fonctionnant sans bibliothèques mathématiques

+4

Il n'est pas spécifié quels en-têtes standard incluent quels autres en-têtes standard. Un programme portable doit explicitement inclure ce qu'il utilise. –

+0

Même réponse mais situation différente: http://stackoverflow.com/questions/9498700/removing-include-algorithm-doesnt-break-the-code – NathanOliver

Répondre

3

Les en-têtes peuvent - et font souvent - inclure d'autres en-têtes. Les en-têtes de bibliothèque standard ne font pas exception à cela.

Même si vous avez choisi de ne pas inclure un en-tête (Appelons-a) que vous dépendez, il est possible que l'en-tête est arrivé à être inclus par un autre en-tête (Appelons-b) que vous avez pas inclus. Dans ce cas, votre programme ne peut pas continuer à fonctionner si l'en-tête b est modifié pour ne pas inclure a. C'est pourquoi vous devez toujours inclure tous les en-têtes dont vous dépendez, même lorsque votre programme semble fonctionner sans inclure certains d'entre eux.

Toutes les différentes versions de différentes implémentations de bibliothèque standard sont différents et donc a dans une version pourrait inclure b tout a dans une autre version pourrait tout aussi bien ne pas inclure b. La même chose s'applique à toutes les API qui ont plusieurs versions d'implémentations.

1

Comme il est explicitement noté ici, pow IS dans l'en-tête cmath. http://www.cplusplus.com/reference/cmath/pow/.

Ce qui est à inclure dans <iostream>, vient de vérifier que la version actuelle de GCC (j'utilise archlinux, donc c'est la dernière version) n'inclut pas cmath dans les includes internes d'iostream.

Quoi qu'il en soit, même si cela fonctionne, c'est contre la norme. Inclure explicitement <cmath>.