37 Stimmen

<iostream> vs. <iostream.h> vs. "iostream.h"

Wenn Sie eine Header-Datei in C++ einbinden, was ist der Unterschied zwischen...

1) die Einbindung von .h gegenüber der Nicht-Einbindung von .h bei der Einbettung in < > Zeichen?

#include <iostream> vs. #include <iostream.h>

2) den Namen der Kopfzeile in doppelte Anführungszeichen zu setzen und nicht in < >-Zeichen zu setzen?

#include <iostream.h> vs. #include "iostream.h"

Vielen Dank im Voraus!

52voto

Adam Davis Punkte 89506

Kurz gesagt:

iostream.h ist veraltet - es ist die ursprüngliche Stroustrup-Version. iostream ist die Version des Normenausschusses. Im Allgemeinen verweisen die Compiler auf beide Versionen, aber einige ältere Compiler haben die ältere Version nicht. In einigen seltenen Fällen existieren beide und sind unterschiedlich (um Legacy-Code zu unterstützen) und Sie müssen dann spezifisch sein.

"" contre <> bedeutet einfach, dass man in den lokalen Verzeichnissen nach dem Header sucht, bevor man die Bibliothek aufruft (in den meisten Compilern).

7voto

Zee JollyRoger Punkte 399

Hier ist ein geeigneter Link Artikel.

Zusammenfassend kann man sagen, dass der Grund dafür gegeben ist:

Die Version der iostream-Bibliothek, die der Normenausschuss produziert hat, unterscheidet sich erheblich von der CFront-Implementierung. {snip}

Um den Übergang zu erleichtern, erklärte das C++ Standards Committee, dass Code der die Standard-C++-Header enthält, Include-Direktiven verwendet, die eine Erweiterung fehlt. Dies ermöglichte es den Compilerherstellern, die Header der alten C++-Bibliotheksheader mit der Erweiterung .h und die Header im neuen Stil ohne.

Ein Vorteil, wenn man nicht die .h-Version verwendet:

Es gibt mehrere Gründe, warum neuer Code unter Verwendung der Version der Header-Dateien ohne Erweiterung anstelle der .h-Formen geschrieben werden sollte. Der erste ist die Unvorhersehbarkeit von solchem Code, wenn er auf modernen Compilern. Wie bereits erwähnt, ist das Ergebnis der Verwendung der .h-Header implementierungsspezifisch. Und mit der Zeit steigt die Wahrscheinlichkeit, dass ein die Chance, dass ein bestimmter Compiler die Bibliothek im alten Stil zur Verfügung stellt, ab.

0 Stimmen

7voto

Aron Insinga Punkte 71

Als die Person im Normungsausschuss (X3J16), die vorgeschlagen hat, das .h wegzulassen, war meine ursprüngliche Absicht, die Debatte über die Dateierweiterungen .h, .H, .hpp, .hxx oder .h++ beizulegen; oder der Wunsch einiger, dass der Standard nicht impliziert, dass dies der Name einer Datei auf der Festplatte ist, um es einer IDE zu ermöglichen, vorkompilierte Header-Informationen aus einem internen Ort wie einer Ressourcendatei oder sogar den Eingeweiden des Compilers zu ziehen.

Während Unix den Dateinamen als eine einzige Zeichenkette betrachtete und das Konzept einer Erweiterung eigentlich nicht kannte, hatten die DEC-Betriebssysteme die Tradition, den Namen von der Erweiterung zu trennen und die "Standard-Erweiterung" zu liefern, wenn sie in bestimmten Kontexten weggelassen wurde. Daher kam ich auf die Idee, es der Implementierung zu überlassen, welche Erweiterung sie verwenden wollte, und es erlaubte der Implementierung, diese Datei nicht einmal auf der Festplatte zu haben. (Damals war ich der Vertreter von DEC im Ausschuss).

Die Unterscheidung zwischen den Standard- und den Vornorm-Headern war ein zusätzlicher Vorteil.

1 Stimmen

Nach der Lektüre einiger Bücher habe ich festgestellt, dass #include<iostream.h> enthält eine spezifische Datei namens iostream.h in unserem Programm, während, #include<iostream> garantiert einfach, dass alles, was zum iostream Bibliothek ist in unserem Programm enthalten. Bin ich richtig?

2voto

CesarB Punkte 41671

Die Standardmethode (und die einzige, die garantiert funktioniert) ist <iostream>. Unter gcc zieht <iostream.h> (das möglicherweise als <backward/iostream.h> eingebunden werden muss) die relevanten Deklarationen in den globalen Namespace (so dass Sie das Präfix std:: Namespace nicht benötigen).

"iostream.h" würde ich zuerst aus dem Verzeichnis mit deinem Quellcode versuchen, da "" für Header aus deinem Projekt gedacht ist. <> sollte immer für System-Header verwendet werden, und "" für Ihre eigenen Header.

0 Stimmen

Upvote für die Erwähnung von ".h"-Deklarationen in globalem Umfang und keine Notwendigkeit des std-Namespace-Präfixes

1voto

Uri Punkte 86472

Normalerweise wird <> für System- oder Standardbibliotheksdateien verwendet, während "" für Projektdateien verwendet wird. Es würde mich nicht überraschen, wenn Ihr Compiler lokal sucht und, wenn er sie nicht finden kann, die Standardbibliotheksversion als Standard verwendet.

Was die .h betrifft, so glaube ich nicht, dass es wirklich eine Rolle spielt, wenn Sie C verwenden. Bei C++ erinnere ich mich vage daran, dass es eine neuere und eine ältere Version gab und dass es ohne das h die neue Version sein sollte, aber ich bin mir nicht einmal sicher, ob die alte Version noch existiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X