Zum Inhalt springen

Frage zu Include <iostream.h> oder using namespace std


Empfohlene Beiträge

Geschrieben

hi

es gibt ja 2 Möglichkeiten, die iostream.h zu inkludieren

1. #include <iostream.h>

2. #include <iostream>

using namespace std;

kann mir jemand mal erklären, warum es diese 2 Varianten gibt, bzw. welche Vorteile die eine gengenüber der anderen hat ?

Geschrieben

Die Version #include <iostream.h>

gibt es, weil C++ Compiler ja auch C Programme kompilieren soll. Deswegen wird hier auch gleich der Namespace "gesetzt". Nun gab es dann ein Problem, daß man sich nicht einigen konnte, wie die Erweiterungen bei C++ heißen sollten. Eine Möglichkeit wäre ja .hpp gewesen. Man hat dann gesagt, man läßt die Endung weg. Das geht nur in C++ und deswegen, wird hier der Namespace nicht gesetzt, weil es kein C Programm sein kann. Außerdem ist es nicht gut mit dem using namespace std; "herumzuschmeißen", denn Ziel von Namespace ist es ja, daß man verschiedene Namensräume hat. Wenn man sie nun in seinem Programm via using namespace... wieder alle zusammen wirft, hätte sich das Standardkomitee die ganze Arbeit sparen können. Deswegen sollte man maximal using namespace std; in eine Funktion 'reinschreiben oder auf std:: zurückgreifen.

Jan

Geschrieben

Es gibt einfach zwei iostream Implementierungen.

includiert man iostream.h dann nimmt man die nicht garantiert standartkonforme iostream des Compilerherstellers.

includiert man #include<iostream> , so ist das die Iostream- Implementierung des Standart - c++.

Ähnliches gild auch für andere Header.

Geschrieben

So wie es maxim_42 schreibt stimmt es nicht und kann es gar nicht stimmen, denn:

Der Standard hat festgelegt, was in iostream "drin" zu sein hat und wie es sich verhält. Wie die einzelnen Compilerhersteller dieses Verhalten erreichen ist denen überlassen und darüber sagt der Standard nichts. Aber <iostream> ob mit oder ohne .h muß sich an den Standard halten, was das Verhalten betrifft. Noch ein Beispiel:

#include<iostream.h>

int main ()

{

cout << "Hallo Welt!\n";

}

Dieses Programm funktioniert wunderbar. Wirft auch keine Warnung aus, weil der Standard besagt, daß in main return 0 weggelassen werden kann.

Folgendes Beispiel geht aber nicht:

#include<iostream>

int main ()

{

cout << "Hallo Welt!\n";

}

Hier ist cout nämlich nicht bekannt, also muß man std::cout << ... schreiben, oder using namespace std; am besten in die main-Funktion.

HTH

Jan

Geschrieben

Es mag etwas pedantisch erscheinen, wird man doch in der Mehrzahl der Fälle keinen Unterschied merken. Aber die Definition, was ein iostream zu tun hat steht im C++ Standart.

iostream.h gab es vor dem (neuen) Standart, eine Garantie für konformes Verhalten gibts nur vom Hersteller.

Am ehesten kann man sich die classic iostream (iostream.h) als eine Extension von standart iostream vorstellen.

Geschrieben

Ich bin auch gerne kleinlich, deswegen vorweg zwei Bemerkungen:

1. Den ISO-Standard (ISO/IEC 14882) gibt es erst seit 1998. Vorher gab es natürlich C++, aber noch keinen Standard. Es gab (und gibt) auch sogenannte Drafts, diese wurden (werden) vielleicht irgendwann Standard (vielleicht aber auch nicht). Wenn man aber über Standard C++ reden möchte, dann muß man zu heutiger Zeit von ISO/IEC 14882 sprechen. Was vor dieser Zeit war, ist unwichtig! (Also auch das, was classic iostream genannt wird.)

2. Natürlich kann nur der Hersteller standardkonformes garantieren. Machen alle auch gerne, halten sich aber nie 100%ig daran. Weder Bjarne Stroustrup noch ANSI noch ISO kann für irgendetwas garantieren. ISO sagt ja auch nur, wenn man ein standardkonformes System hat, dann sind bestimmte Dinge garantiert. Wenn das System nicht konform ist, dann garantiert Iso natürlich nichts. Es ist ja sogar so, daß der Standard von "undefined behavior" in bestimmten Kontexten spricht. Das heißt, der Compilerhersteller kann selber entscheiden wie er diese Situation bearbeitet. (Dies sollte man vermeiden, denn damit ist die Portierbarkeit nicht mehr garantiert.)

Das erstmal vorweg, jetzt zum eigentlichen Problem:

Vor der Standardisierung gab es in der Tat die Möglichkeit (zum Beispiel) <iostream.h> einzubinden. Viele (wahrscheinlich sogar sehr viele) Compilerhersteller bieten diese Art Header einzubinden immer noch aus Kompatibilitätsgründen an. Der Standard spricht aber von <iostream> (oder auch von <map>, <fstream>,...). Es ist nämlich der Implementation überlassen, ob es tatsächlich eine Datei iostream.h gibt. Der Compilerhersteller hat die freie Wahl. Also ISO-C++ wäre es #inlcude <iostream> zu schreiben. Das #include <iostream.h> wird nur noch zur Kompatibilität angeboten.

Jetzt zur Geschichte mit den classic iostreams. Ja, die gab es und zwar vor der Standardisierung. Diese arbeiteten nicht mit Templates. Im Standard wurde dann die "neuen" iostreams, die mit Templates arbeiten, beschlossen. Daß sich der Name von <iostream.h> zu <iostream> geändert hat, hat mit dem oben Erwähnten zu tun und nicht damit, daß man mit <iostream.h> auf die classic iostreams zugreifen könnte.

HTH

Jan

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...