2016-07-17 7 views
4

Ich machte einen Online-Code-Wettbewerb und meine Idee war es, eine Kopfzeile zu finden, die einen kürzeren Namen als <iostream> hat, aber <iostream> enthält. Nun, ich bin bis jetzt nicht erfolgreich gewesen, aber das hat mich wundern lassen:Gibt der Standard an, welche Header andere Header enthalten?

Gibt der Standard an, welche Header andere Header enthalten?

Zum Beispiel auf <iostream>cplusplus Zustände:

Einschließlich diesen Header automatisch können andere Header, wie <ios>, <streambuf>, <istream>, <ostream> und/oder <iosfwd>.

Allerdings, wenn ich für <ios> aussehen gibt es keine solche Aussage als „Dieser Header kann durch <iostream> aufgenommen werden“. Bei einigen Überschriften könnte ich mir vorstellen, dass sie andere enthalten müssen, damit sie richtig funktionieren. Und wenn dies der Fall ist, würde ich erwarten, dass der Standard eine Aussage darüber macht, wie die Header voneinander abhängen (z. B. müssen zyklische Abhängigkeiten vermieden werden). Oder stellt der Standard einfach sicher, dass solche Abhängigkeiten nicht existieren und es an der Implementierung liegt?

+2

Gehen Sie nicht nach "cplusplus" für gute oder Peer-Review-Informationen. – PaulMcKenzie

+0

@PaulMcKenzie was ist eine bessere Quelle? Ich habe nicht in der Frage gefragt, weil es vom Thema wäre ... – user463035818

+2

Für eine, [diese Seite] (http://en.cppreference.com/w/). – PaulMcKenzie

Antwort

2

Soweit I wissen, gibt der Standard nicht, welche Header andere Header enthalten - das ist die Implementierung definiert und nicht etwas, auf das Sie jemals verlassen sollten. Enthalten Sie, was Sie verwenden.

Auch möchten Sie vielleicht bevorzugen http://cppreference.com/ über http://cplusplus.com/ wie es ist (IMHO) von viel höherer Qualität.

+0

auf cppref es sagt "inlcudes" anstelle von "may include", würde dies nicht bedeuten, dass alle Implementierungen die aufgeführten Header enthalten sollten? – user463035818

+0

@ tobi303 richtig, aber * I * kann nichts finden, die behauptet, dass "foo" enthält "bar" Garantien im Standardtext Wenn Sie können, dann teilen Sie bitte die Informationen. –

1

Im Allgemeinen nein, der Standard legt nicht fest, dass Header andere Header enthalten müssen; Es liegt an der Implementierung, die Namen von anderen Headern zu erhalten, wenn sie benötigt werden, und Standard-Header dürfen andere Standard-Header enthalten.

Die einzige Ausnahme ist die Kopfzeile <initializer_list>; Header, die Initialisierungslisten verwenden (z. B. Container), müssen diesen Header enthalten.

2

Die allgemeine Regel, über die Header von anderen Headern enthalten sein können, ist: Es gibt einige Header, die automatisch hinzugefügt werden, und ansonsten hängt es von der Implementierung ab und muss nicht dokumentiert werden.

17.6.5.1 Konforme Implementierungen [konform]

17.6.5.2 Headers [res.on.headers]

1 A C++ Header anderen C++ Header enthalten kann. Ein C++ - Header muss die Deklarationen und Definitionen enthalten, die in der Übersicht erscheinen. Ein C++ - Header, der in seiner Synopse als anderer C++ - Header angezeigt wird, muss die Deklarationen und Definitionen enthalten, die in den Synopsen dieser anderen Header erscheinen.

Das etwa gilt für "in seiner Übersicht als mit anderen C++ Header gezeigt" -Regel:

  • <utility>, <string>, <array>, <deque>, <forward_list>, <list>, <vector>, <map>, <set>, <unordered_map>, <unordered_set> , <queue>, <stack>, <algorithm>, <random>, <valarray>, <regex> enthalten <initializer_list>.
  • <bitset> enthält <string>, <iosfwd>.
  • <iostream> enthält <ios>, <streambuf>, <istream>, <ostream>.
  • <ios> enthält <iosfwd>.

Jedoch obwohl z.B. <ios> wird als einschließlich <iosfwd> gezeigt, die Implementierung kann in der Lage sein, die Anforderungen zu erfüllen, ohne sie tatsächlich einzubeziehen, und pro [res.on.headers], das ist in Ordnung. Zum größten Teil macht es keinen Unterschied, ob die Implementierung die anderen Header enthält, solange die deklarierten Funktionen und Typen zugänglich gemacht werden.

1

Es hängt davon ab welche Version des Standards bezieht sich auf. C++ 98 und C++ 03 machen keine Anforderung für Header einschließlich anderer Header.

Beginnend mit entweder C++ 11 oder C++ 14, schreibt der Standard vor, dass bestimmte Header andere Header enthalten.

Alle Versionen des Standards erfordern, dass die mehrfache Verwendung desselben Headers sicher ist.

Wenn Sie also wissen, dass Sie einen bestimmten Header benötigen und an einem Compiler arbeiten, der einen älteren Standard implementiert, müssen Sie nur den Header einschließen.

Verwandte Themen