2013-05-12 4 views
15

Ich begann C++ zu lernen und ich las ein Buch, das schreibt, dass ich die Header-Datei <string> verwenden muss, da der String-Typ nicht direkt in den Compiler eingebaut ist. Wenn ich die <iostream> verwende, kann ich den String-Typ verwenden.Muss ich #include <string> neben <iostream> verwenden?

Muss ich den Header einschließen, wenn ich den String-Typ verwenden möchte, wenn ich den Header <iostream> einfüge? Warum? Gibt es einen Unterschied?

Antwort

17

Ja, Sie müssen angeben, was Sie verwenden. Es ist nicht vorgeschrieben, dass Standard-Header einander enthalten (mit einigen Ausnahmen IIRC). Es könnte jetzt funktionieren, könnte aber bei einem anderen Compiler fehlschlagen.

In Ihrem Fall, offenbar <iostream> enthält <string>, direkt oder indirekt, aber nicht darauf angewiesen.

+0

Es ist wahrscheinlich eine Vorwärtsdeklaration von String ( enthält , die ing gcc-Implementierung enthält). Ich denke, das ist Standardverhalten (müsste den Standard überprüfen), also glaube ich, dass er sich darauf verlassen kann, wenn er nicht den vollen Typ braucht. – Aleph

+0

@AnotherTest "Ich kann den String-Typ verwenden" - sagt mir, er braucht den vollen Typ. Wenn nicht, würde eine Vorwärtsdeklaration ja tun. –

+0

27.5.1 besagt, dass enthalten muss. Das braucht nur char_traits, also bin ich mir nicht sicher, ob ein Compiler auch deklarieren 'string' weiterleiten muss. Ich bezweifle immer noch, dass jede Implementierung von Iostream den gesamten String-Header enthält. – Aleph

7

Muß ich die <string> Header enthalten, wenn ich den String-Typen verwendet werden soll, wenn ich die <iostream> Header enthalten?

Ja, Sie müssen. Sie können sich nicht darauf verlassen, dass relevante Header (z. B. <string>) indirekt über andere Header (z. B. <iostream>) übertragen werden, obwohl dies bei einigen Implementierungen der Fall sein könnte.

Und selbst wenn diese scheinen zu arbeiten, könnte es zu Problemen führen, wenn nicht alle relevanten Überlastungen von einigen Betreibern importiert werden, oder wenn eine Klasse voraus erklärt in einem Header Sie #include, sondern Informationen über Diese Klasse, die von einer anderen Klasse abgeleitet ist, ist nur in einer Kopfzeile enthalten, die nicht #include d.

Siehe zum Beispiel this Q&A on StackOverflow für ein Beispiel für solche Situationen.

+0

[ios_base :: getloc] (http://en.cppreference.com/w/cpp/io/ios_base/getloc) gibt ein 'std :: locale 'nach Wert zurück und [locale :: name] (http://de.cppreference.com/w/cpp/locale/locale/name) gibt 'std :: string' nach Wert zurück, so dass' #include 'tatsächlich benötigt wird, um' std :: string' zu definieren. Nur die Nichtmitglieder von '' sind optional. – Cubbi

+0

sehr guter Punkt. Ich bin gerade auf ein Problem gestoßen, bei dem ein Bibliothekscode, den wir verwenden, darauf angewiesen ist und als wir von einem sehr alten OS/Compiler auf eine neuere Version umgestellt haben, brach die Kompilierung aus "keinem ersichtlichen Grund" anders als dieser. – user320781

Verwandte Themen