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 ;
    }
    

  • Mod

    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


Log in to reply