Automatisch inkludierte Header



  • Hallo,
    mir ist gerade, als ich versucht habe, ein bereits fertiges Projekt noch einmal mit einem anderen Compiler zu übersetzen, dass ich vergessen hatte <limits> zu inkludieren.
    In Visual Studio funktionierte std::numeric_limitsstd::streamsize::max() auch ohne besagte Inkludierung, was mich vor die Frage stellt, ob ich trotzdem immer diese Header inkludieren soll oder das überflüssig ist.
    Gleiches auch mit den Funktionen std::srand() und std::rand(), für die man unter Visual Studio nichts inkludieren muss, unter DEV C++ aber <cstdlib>.
    In DEV C++, den ich anfangs benutzte, musste man zum Beispiel nie <string> inkludieren, da dies irgendwie automatisch miteingebunden wurde.
    Daher, soll ich immer alles inkludieren oder nur das, was der Compiler braucht, um den Code übersetzen zu können, obwohl entscheidende Header eigentlich fehlen.

    Danke schon einmal!



  • Mein Programm compiliert nicht weil ich <cstdlib> nicht includiert habe. Soll ich das korrigieren oder doch lieber Briefmarken sammeln?

    Bin für jeden Tipp dankbar 😃



  • Im Standard steht geschrieben welche Klassen "über welche Header zu erreichen" sind*. Du solltest immer für jede Klasse/Funktion die du verwendest zumindest eine Header inkludieren über die die Klasse/Funktion garantiert zu erreichen ist. Egal ob es auch mit weniger geht oder nicht -> "include what you use".

    Für viele Dinge gibt es mehrere Header über die sie garantiert zu erreichen sind. z.B. ist std::istream garantiert über <istream> sowie <iostream> zu bekommen. Wenn du std::iostream und std::istream verwendest, musst du natürlich nicht <istream> und <iostream> inkludieren -- nur <iostream> reicht.

    Dummerweise ist es aber auch so dass die meisten (alle?) Library-Implementierungen nicht "sauber" sind was das anziehen von "nicht vorgeschriebenen" Headern angeht. D.h. es könnte leicht sein dass du <exception> nicht inkludieren musst, wenn du schon <vector> inkludiert hast. Weil vermutlich in vielen Libraries in vector<T, A>::at direkt die Exception geworfen wird, was natürlich nur geht wenn <exception> vorher von <vector> inkludiert wurde. Muss aber nicht so sein, denn vector<T, A>::at könnte auch eine Hilfsfunktion verwenden um die Exception zu werfen. Dann muss nur die Hilfsfunktion bekannt sein, nicht aber die Klasse std::out_of_range oder ihre Basisklassen.
    Und genau das ist der Grund warum du "include what you use" machen solltest: damit es funktioniert, egal mit welcher Standard Library du übersetzt.

    *: Natürlich interessiert es wenig Leute immer im Standard nachzugucken, aber dafür gibt's ja Seiten wie http://en.cppreference.com/w/cpp/header bzw. Tools wie eben https://include-what-you-use.org/

    ps: Briefmarken sammeln ist natürlich auch eine gute Idee.



  • Also immer lieber alles inkludieren, auch wenn es überflüßig scheint. Danke, hustbaer.

    NächsteFrage schrieb:

    Mein Programm compiliert nicht weil ich <cstdlib> nicht includiert habe. Soll ich das korrigieren oder doch lieber Briefmarken sammeln?

    Bin für jeden Tipp dankbar 😃

    🙄


Log in to reply