web-dev-qa-db-fra.com

cmath vs math.h (et en-têtes d'extension c-prefixed vs .h similaires)

J'ai vu des informations sur les différences entre des choses comme iostream vs iostream.h. D'après ce que j'ai compris de ceux-ci, la différence entre eux est que la version sans .h l'extension ne remplira pas l'espace de noms tandis que la version avec l'extension le sera.

Est-ce la même chose pour cmath vs math.h? Pourquoi cmath (et de nombreux autres fichiers similaires) est-il préfixé avec un c au lieu d'être simplement math? Y a-t-il plus de différences entre eux?

55
golmschenk

J'ai vu des informations sur les différences entre des choses comme iostream vs iostream.h.

[iostream.h] n'est pas un en-tête standard.

ce n'est pas un exemple de la question que vous soulevez.

[cmath] définit des symboles dans l'espace de noms std et peut également définir des symboles dans l'espace de noms global. [math.h] définit des symboles dans l'espace de noms global et peut également définir des symboles dans l'espace de noms std. si vous incluez le premier et utilisez un symbole non qualifié, il peut être compilé avec un compilateur mais pas avec un autre. c'est donc une bonne idée d'utiliser [math.h]. et en général, pour ces paires d'en-têtes, utiliser la version [.h].

c ++ 98 a fourni une garantie formelle que l'en-tête c xxx ne pollue pas l'espace de noms global. c'est peut-être pour cela qu'ils ont été définis. cependant, c'était un peu plus difficile à mettre en œuvre que les polluants, donc en pratique aucune implémentation de bibliothèque standard que je connaisse n'a suivi la norme à cet égard, et donc elle a finalement été modifiée pour refléter la réalité en c ++ 11.

29

Cela serait peut-être utile:

La bibliothèque C++ comprend les mêmes définitions que la bibliothèque de langage C organisée dans la même structure de fichiers d'en-tête, avec les différences suivantes:

1 - Chaque fichier d'en-tête porte le même nom que la version en langage C mais avec un préfixe "c" et sans extension. Par exemple, l'équivalent C++ pour le fichier d'en-tête du langage C <stdlib.h> est <cstdlib>.

2 - Chaque élément de la bibliothèque est défini dans l'espace de noms std.

en-têtes d'extension c-préfixé vs .h

4
Hani Shams

Les en-têtes dont les noms commencent par c sont dérivés des en-têtes de la bibliothèque standard C. Les en-têtes correspondants avec le préfixe c supprimé et un .h le suffixe ajouté est identique (ou presque identique) aux en-têtes de bibliothèque C standard.

<cmath> définit les symboles appropriés sous l'espace de noms std; <math.h> les définit globalement.

(Je viens d'apprendre que ce n'est pas aussi simple que ça; voir la réponse d'Alf.)

1
Keith Thompson