Einführung in include-Direktiven in C++ im Rahmen der Lehre der C++-Programmierung. (include-Direktiven), Lektion, Seite 722231
https://www.purl.org/stefan_ram/pub/c++_include (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram

#include -Direktiven in C++ 

Wenn bestimmte Bibliotheksteile in ihrer Standardbedeutung verwendet werden sollen, dann ist es nötig, bestimmte #include -Direktiven an den Anfang des Programms zu schreiben, damit die C++ -Implementation dieser Bibliotheksteile kennenlernt.

Die #include-Direktive weist die Implementation an, die Beschreibung eines bestimmten Teils der Bibliothek zu lesen.

main.cpp

#include <iostream>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main(){ ::std::cout << "Hallo!"s << "\n"s; }

Tabelle

Name oder Operator benötigte #include-Direktive

::std::cout #include <iostream>
<< #include <ostream>
::std::literals #include <string>
s #include <string>

Soll der Text »::std::cout« in seiner Standardbedeutung verwendet werden, muß die include-Direktive »#include <iostream>« ganz am Anfang des Quelltextes ganz auf einer Zeile für sich stehen.

Die mit einem Doppelkreuz »#« beginnenden Präprozessordirektivzeilen sind eine Ausnahme von der allgemeinen Formatierungsfreiheit in C++ : Bei ihrer Verwendung sind Zeilenenden und Leerzeichen nicht austauschbar. Diese Präprozessordirektiven müssen jeweils auf einer eigenen Zeile stehen. Es ist also nicht gestattet, mehrere solche Direktiven in eine Zeile zu schreiben oder eine Direktive auf mehrere Zeilen aufzuteilen. (Spezielle Schreibweisen, welche dies in bestimmten Fällen doch erlauben, sollen hier noch nicht behandelt werden.) Am Ende der Zeile darf jedoch ein Kommentar stehen. Das wird manchmal verwendet, um den Grund für die include-Direktive zu vermerken.

hallo.cpp

#include <iostream> // ::std::cout
#include <ostream> // <<
#include <string> // "s

using namespace ::std::literals;

int main(){ ::std::cout << "Hallo!"s << "\n"s; }

Soll die lexikalische Einheit »<<« wie oben zur Ausgabe verwendet werden, muß die include-Direktive »#include <ostream>« ganz am Anfang des Quelltextes ganz auf einer Zeile für sich stehen. In dem obigen Programmbeispiel ist »#include <ostream>« allerdings nicht mehr nötig, weil laut N3290, 27.4.1, synopsis dieses bereits in »#include <iostream>« enthalten ist. Trotzdem wird sie im obigen Programm verwendet, weil dann durch einen Kommentar der direkte Zusammenhang zwischen »#include <ostream>« und »<<« verdeutlicht werden kann. In vergleichbaren Programmen aus anderen Quellen wird man sie aber oft nicht finden. Die Direktive »#include <string>« erlaubt die Verwendung von C++ -Zeichenfolgenliteralen.

Wenn eine notwendige include-Direktive einmal vergessen wurde, dann bedeutet das nicht, daß das Programm sich deswegen anders verhalten muß oder eine C++ -Implementation den Fehler bemerken muß. Trotzdem ist das Programm dann fehlerhaft und es kann sein, daß sich das nach einer Änderung des Programms oder einem Wechsel der Implementation bemerkbar machen wird. Deswegen muß der Programmierer selber darauf achten, immer die passenden include-Direktiven zu verwenden.

Das folgende Programm läuft zwar unter der zum Test verwendeten C++-Implementation, jedoch ist dies durch die Norm nicht garantiert.

main.cpp

#include <iostream>
#include <ostream>

using namespace ::std::literals;

int main(){ ::std::cout << "Hallo!"s << "\n"s; }

Protokoll
Hallo!

Es ist übrigens in der Regel kein Fehler und meistens auch unschädlich, gleich immer alle möglichen Include-Direktiven „auf Vorrat“ an den Anfang eines Programms zu schreiben, höchstens könnte dies den Aufwand und die Dauer der Übersetzung verlängern, was aber bei den Programmen in diesem Kurs kein Problem darstellt. Trotzdem achten viele Programmierer darauf nur die notwendigen Include-Direktiven zu verwenden, vielleicht auch, weil dies dokumentiert, welche Teile von Bibliotheken in einem Programm verwendet werden und welche nicht.

Weil es nötig werden könnte, weitere #include -Direktiven zu verwenden, kann der Ausdruckrahmen um eine zusätzliche Lücke für diese erweitert werden.

Ausdruckrahmen mit zusätzlicher Lücke für weitere include-Direktiven

#include <iostream>
#include <ostream>
#include <string>

using namespace ::std::literals;

int main(){ ::std::cout << … << "\n"s; }

Neu hinzugefügte Anmerkungen

Wir nennen include-Direktive auch manchmal eindeutschend Inklusionsdirektiven.

Wir stellen uns vor, daß eine Inklusionsdirektive der Art wie »#include <iostream>« eine Sammlung von Informationen in unser Programm einfügt (oder „inkludiert “), die wir eindeutschend auch als Köpfer  bezeichnen. Das heißt, wir sagen auch, daß die Inklusionsdirektive »#include <iostream>« den Köpfer »<iostream>« einfüge.

Quellen *

N3290
17.6.5.2 Headers [res.on.headers]
1 … A C++ header shown in its synopsis as including other C++ headers shall provide
the declarations and definitions that appear in the synopses of those other headers.
N4687

30.4.1 Header <iostream> synopsis [iostream.syn]

#include <ios> // see 30.5.1

#include <streambuf> // see 30.6.1

#include <istream> // see 30.7.1

#include <ostream> // see 30.7.2

N4687

30.5.1 Header <ios> synopsis [ios.syn]

#include <iosfwd> // see 30.3.1

N4687
30.6.1 Header <streambuf> synopsis [streambuf.syn]
N4687
30.7.1 Header <istream> synopsis [istream.syn]
N4687
30.7.2 Header <ostream> synopsis [ostream.syn]
N4687
30.3.1 Header <iosfwd> synopsis [iosfwd.syn]
N4687
30.7.2 Header <ostream> synopsis [ostream.syn]
N4687 ("::std::" hinzugefügt)

24.3.1 Header <string> synopsis [string.syn]

#include <initializer_list>

inline namespace literals
{ inline namespace string_literals
{ string operator""s(const char* str, ::std::size_t len); }}}

Häufige Fehler ⃗

Häufiger FehlerEin häufiger Fehler ist der Irrglaube, die #include -Direktiven würden Bibliotheken  zum Programm hinzufügen. Zwar benötigt ein Programm tatsächlich meist Bibliotheken, doch die Standardbibliothek wird von der C++ -Implementation immer automatisch zu dem Programm gefügt. Zuständig für die Verbindung mit Bibliotheksteilen ist der Binder, welcher erst nach dem Compiler läuft. Richtig ist es vielmehr, daß die #include -Direktiven Beschreibungen  von bestimmten Teilen  (iostream, ostream, …) von Bibliotheken enthalten, welche dem Compiler sagen, welchen Typ  bestimmte Namen (wie beispielsweise »::std::cout«) haben. Ohne diese Information kann der Compiler das Programm nicht richtig verstehen, obwohl die Standardbibliothek sonst auch ohne die #include -Direktiven verfügbare wäre.

Häufiger FehlerOft werden #include-Direktiven als #include-Anweisungen bezeichnet. Es handelt sich aber nicht um Anweisungen im Sinne der Programmiersprache C++.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram722231 stefan_ram:722231 include-Direktiven Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722231, slrprddef722231, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/c++_include