Wikipedias Meinung zu (laut Standard) nötigen Headern bei Hello-World Programmen
-
Hiho!
Aus Wikipedia:
#include <iostream> #include <ostream> int main() { std::cout << "Hallo Welt!" << std::endl; }Erläuterungen: Bei main handelt es sich um die Haupt-Funktion. Sie ist in jedem C++-Programm vorhanden und dient als Einstiegspunkt des Programms. Die Funktion main ist die einzige Funktion, die – obwohl sie einen Wert zurückgibt – nicht die Anweisung „return“ benötigt. Ohne die explizite Anweisung return gibt main den Wert 0 zurück. Die Header-Datei <ostream>, welche durch den Präprozessor eingefügt wird, sollte hier eingebunden werden, da der Standard nicht verlangt, dass <iostream> diese Header-Datei einbindet.
Also, was genau macht jetzt iostream? Sollte es nicht laut Standard std::cout, std::cin, std::cerr und std::clog deklarieren?
Dielen Vank im Voraus!
-
Standard:
27.3 Standard iostream objects <iostream>
Also!
1 The header <iostream> declares objects that associate objects with the standard C streams provided for by the functions
declared in <cstdio> (27.8.2).Synopsis:
namespace std { extern istream cin; extern ostream cout ; extern ostream cerr ; extern ostream clog ; extern wistream wcin ; extern wostream wcout ; extern wostream wcerr ; extern wostream wclog ; }
-
Hacker schrieb:
Also, was genau macht jetzt iostream? Sollte es nicht laut Standard std::cout, std::cin, std::cerr und std::clog deklarieren?
Schon, das Problem sind nicht die Objekte sondern die überladenen Operatoren. In diesem Falle kann man die Frage so stellen, ob garantiert ist, dass basic_ostream durch bloßes Einbinden von <iostream> nicht bloß deklariert, sondern auch definiert wird (da die Inserter in diesem Falle Member sind).
In C++03 war das nicht klar geregelt, bei den meisten Implementationen dürfte es allerdings der Fall gewesen sein:
Ein Header, der bloß Objekte deklariert, ohne irgendwelche Operationen, die mit diesen Objekten verwendet werden können, ist ziemlich sinnlos.In C++11 ist die Sache geklärt:
<iostream> bindet <ios>, <streambuf>, <istream> und <ostream> ein.
-
camper schrieb:
In C++11 ist die Sache geklärt:
<iostream> bindet <ios>, <streambuf>, <istream> und <ostream> ein.Gut, dann werd' ich das bei Wikipedia bald mal editieren.
THX