2012-05-22 3 views
39

Ich habe einige Informationen über Unterschiede zwischen Dingen wie iostream vs iostream.h. Aus dem, was ich daraus gewonnen habe, besteht der Unterschied darin, dass die Version ohne die Erweiterung .h den Namensraum nicht füllen wird, während die Version mit der Erweiterung.C++ - cmath vs math.h (Und ähnliche c-prefixed vs. H Erweiterung Header)

Ist dies das gleiche für cmath vs math.h? Warum ist cmath (und viele andere ähnliche Dateien) mit c vorangestellt anstatt nur math? Gibt es mehr Unterschiede zwischen ihnen?

Vielen Dank für Ihre Zeit!

+0

Siehe auch http://stackoverflow.com/q/2118422 und http: // Stackoverflow.com/q/2587445 für verwandte (aber vielleicht nicht dumme) Fragen. –

Antwort

22

ich einige Informationen über die Unterschiede zwischen den Dingen wie Iostream vs iostream.h gesehen habe.

[iostream.h] ist keine Standardkopfzeile.

Es ist kein Beispiel für das Problem, das Sie auslösen.

[cmath] definiert Symbole im Namespace std und kann auch Symbole im globalen Namespace definieren. [math.h] definiert Symbole im globalen Namespace und definiert möglicherweise auch Symbole im Namespace std. Wenn Sie das erstere verwenden und ein nicht qualifiziertes Symbol verwenden, kann es mit einem Compiler kompilieren, aber nicht mit einem anderen. Daher ist es eine gute Idee, [math.h] zu verwenden. und im Allgemeinen für solche Header-Paare, die [.h] -Version zu verwenden.

C++ 98 lieferte eine formale Garantie für den c xxx Header, der den globalen Namespace nicht verschmutzt. Vielleicht waren sie deshalb definiert worden. das war jedoch ein bisschen schwieriger zu implementieren als umweltschädliche, so dass in der Praxis keine Standard-Bibliotheks-Implementierung, die ich kenne, dem Standard in dieser Hinsicht folgte, und so wurde es schließlich geändert, um die Realität in C++ 11 widerzuspiegeln.

+8

'daher ist es eine gute Idee, [math.h] zu verwenden. und im Allgemeinen, für solche Header-Paare, um die [.h] -Version zu verwenden. Ich würde nicht zustimmen. Der einzige Grund, warum die .h-Versionen existieren, ist die Kompatibilität. Die C-Header sind aus einem Grund unter [** deep ** .c.headers] aufgelistet. –

+12

@Jesse: Das Argument geht, dass, wenn Sie 'math.h' enthalten, dann wissen Sie * Sie fallen einen Haufen Müll in Ihrem globalen Namespace. Wenn Sie 'cmath' angeben, dann * oder * können Sie * einen Haufen Müll in Ihrem globalen Namespace löschen. Umgekehrt ist es dir egal, ob du einen Haufen Müll in namespace 'std' liegst oder nicht, da du dort sowieso nie Symbole definierst. Die Unsicherheit darüber, was "math.h" bedeutet, ist in gewisser Weise besser als die Ungewissheit darüber, was "cmath" tut, ungeachtet dessen, was das Komitee darüber denkt. –

+0

@Alf: hat sogar EDG das in C++ 03 falsch gemacht? Zum Schämen. –

1

Die Header, deren Namen mit c beginnen, sind von den Headern der C-Standardbibliothek abgeleitet. Die entsprechenden Header mit dem Präfix c entfernt und ein .h hinzugefügt Suffix sind identisch (oder sehr fast identisch) mit den C-Standard-Bibliothek Header.

<cmath> definiert die relevanten Symbole unter dem Namensraum std; <math.h> definiert sie global.

(ich habe gerade erfahren, ist es nicht ganz so einfach,. Alfs Antwort sehen)

+3

-1 Nein, die Header, die mit 'c' beginnen, sind C++ - spezifische Varianten von C-Standardbibliotheksheadern. Sie stammen nicht aus der C-Bibliothek. Es gibt auch keine Garantie, dass 'cmath' die Symbole im globalen Namespace nicht definiert, und es gibt keine Garantie, dass' math.h' die Symbole im Namespace 'std' nicht definiert. –

+1

@ Cheersandhth.-Alf: Sloppy Wortlaut meinerseits; Ich meinte nicht "von der C-Standard-Bibliothek", dass sie * direkt * von der C-Standard-Bibliothek sind. Ich wusste nicht, dass '' globale Symbole definieren könnte und '' könnte Symbole im 'std' Namespace definieren. Jetzt, wo ich weiß, bin ich verwirrt; Warum lässt der C++ - Standard diese Implementierung definiert? –

+0

@KeithThompson: Weil es die Realität widerspiegelt. Viele Standard-Bibliotheksimplementierungen haben es so lange geschafft. Anstatt Implementierungen dazu zu zwingen, bei diesem Thema strenger zu sein (die Erfahrung zeigt, dass dies nicht ganz so gut funktioniert hat), lockerte das Standardkomitee die Erwartungen der Programmierer. –

0

Vielleicht wäre dies hilfreich sein:

Die C++ Bibliothek enthält die gleichen Definitionen wie der C-Sprache Bibliothek in der gleichen Struktur von Header-Dateien organisiert, mit den folgenden Unterschieden: Jeder Header-Datei die gleiche ist Name wie die C Sprachversion, aber mit einem "C" Präfix und keine Erweiterung. Zum Beispiel ist das C++ - Äquivalent für die C-Sprachen-Header-Datei . Jedes Element der Bibliothek ist im Namespace std definiert.

c-prefixed vs .h extension headers