Warum wird durch das Weglassen von „#include ” Verursacht nur manchmal Kompilierungsfehler?

Lesezeit: 5 Minuten

Warum wird durch das Weglassen von „include Verursacht nur
Benutzer1245895

Ich bin ein Anfänger mit C++. Wenn ich den Code schreibe, schreibe ich manchmal #include <string> und der Code funktioniert, andere Male schreibe ich nicht #include <string> und der Code funktioniert nicht. Aber manchmal geht es auch ohne #include <string>.

Also muss ich schreiben #include <string> damit der Code funktioniert?

  • Leute, was zum Teufel?! Das ist natürlich eine echte, berechtigte Frage! Woher kommen all die Downvotes und Close-Votes? Geh wieder ins Bett.

    – Konrad Rudolf

    2. März 2012 um 20:11 Uhr


  • Irgendwie war diese Frage meiner Meinung nach so effektiv wie these are not the droids you are looking for.

    – Karl Philipp

    2. März 2012 um 20:16 Uhr

  • Die Frage hätte besser gestellt werden können, aber wenn sie mit „Ich bin ein Anfänger mit C++“ beginnen, kann man davon ausgehen, dass sie möglicherweise nicht ganz verstehen, wie Includes funktionieren, und einen Kommentar hinterlassen, anstatt zu schließen oder abzustimmen.

    – AJG85

    2. März 2012 um 20:29 Uhr

1646887807 145 Warum wird durch das Weglassen von „include Verursacht nur
Konrad Rudolf

Wenn Sie Member verwenden, die innerhalb des Standardheaders deklariert sind string dann ja, Sie müssen diesen Header entweder direkt oder indirekt (über andere Header) einschließen.

Etwas Compiler an etwas Plattformen können auf etwas Uhrzeit des Monats kompilieren, obwohl Sie den Header nicht eingeschlossen haben. Dieses Verhalten ist unglücklich, unzuverlässig und bedeutet nicht, dass Sie den Header nicht einschließen sollten.

Der Grund ist einfach, dass Sie andere Standard-Header eingefügt haben, die Auch zufällig enthalten string. Aber wie gesagt, darauf kann man sich im Allgemeinen nicht verlassen und es kann sich auch sehr plötzlich ändern (zB wenn eine neue Version des Compilers installiert wird).

Fügen Sie immer alle erforderlichen Header hinzu. Leider scheint es keine zuverlässige Online-Dokumentation darüber zu geben, welche Header eingefügt werden müssen. Konsultieren Sie ein Buch oder den offiziellen C++-Standard.

Der folgende Code wird beispielsweise mit meinem Compiler kompiliert (gcc 4.6):

#include <iostream>

int main() {
    std::string str;
}

Aber wenn ich die erste Zeile entferne, kompiliert es nicht mehr, obwohl die iostream Header sollte eigentlich ohne Bezug sein.

  • Irgendeine Idee, ob es mit anderen Header-Dateien als passiert <string>?

    – Siyuan Ren

    9. März 2013 um 10:43 Uhr

  • @CR Offensichtlich ist dies definitiv der Fall, da sich die Standardheader manchmal gegenseitig verwenden. Zum Beispiel, std::pair ist darin definiert <utility> doch es gibt Nein Implementierung der Standardbibliothek, die erfordert, dass Sie diesen Header einschließen, wenn Sie ihn bereits eingefügt haben <map> da letzteres erfordert std::pair. Das Gleiche gilt auch für andere Arten. Dies ist übrigens eine der großen Schwächen des C++-Header-Systems gegenüber einem richtigen Modulsystem.

    – Konrad Rudolf

    9. März 2013 um 11:38 Uhr


  • Bezüglich Leider scheint es keine zuverlässige Online-Dokumentation darüber zu geben, welche Header eingefügt werden müssen. Sie können jederzeit auf cpreference.com nach dem suchen, was Sie verwenden, und es wird Ihnen die Kopfzeile mitteilen, in der es sich befindet.

    – NathanOliver

    19. Juli 2016 um 13:39 Uhr

  • @NathanOliver Ja, sie dokumentieren das jetzt rigoros. Frühere Versionen nicht. cppreference.com ist heutzutage meine Anlaufstelle Nr. 1.

    – Konrad Rudolf

    19. Juli 2016 um 13:44 Uhr

Es ist möglich, dass andere Überschriften, die Sie tun enthalten haben #include <string> in ihnen.

Trotzdem ist es normalerweise eine gute Idee, dies zu tun #include <string> direkt in Ihrem Code, auch wenn dies für einen erfolgreichen Build nicht unbedingt erforderlich ist, falls sich diese “anderen” Header ändern – beispielsweise aufgrund einer anderen (oder anderen Version von) Compiler / Standardbibliotheksimplementierung, Plattform oder sogar nur einer Build-Konfiguration.

(Natürlich gilt diese Diskussion für jeden Header, nicht nur <string>.)

Obwohl es keine gibt Direkte Auftreten von #include <string> in einer bestimmten Quelldatei bedeutet nicht, dass sie nicht von einer anderen Header-Datei eingeschlossen wurde. Bedenken Sie:

Datei: header.h

#if !defined(__HEADER_H__)
#define __HEADER_H__

// more here
#include <string>
// ...and here

#endif

Datei: source1.cc

#include <string>

void foo()
{
    // No error here.
    string s = "Foo";
}

Datei: source2.cc

#include <header.h>

void bar()
{
    // Still no error, since there's a #include <string> in header.h
    string s = "Bar";
}

Datei: source3.cc

void zoid()
{
    // Here's the error; no such thing as "string", since non of the
    // previous headers had been included.
    string s = "Zoid";
}

Wenn Sie nur einen Zeiger/eine Referenz auf einen benutzerdefinierten Typ verwenden, muss der Typ nur deklariert werden:

class my_class;
void foo(const my_class& c);

Aber wenn Sie den Wert verwenden, muss der Compiler die Größe und damit die Definition des Typs kennen.

Und denken Sie daran, dass Standard-Header andere enthalten können, was nicht automatisch bedeutet, dass alle Implementierungen dies tun, also können Sie sich nicht darauf verlassen.

Es ist nicht wahr, dass der Header-String von anderen Headern eingeschlossen wird. Der Header-String selbst hat nur Includes. Keine Definitionen. Alle notwendigen Definitionen, die für die Verwendung von Zeichenfolgen benötigt werden, befinden sich also in Headern, die von der Header-Zeichenfolge enthalten sind. Diese Header können bereits von anderen Headern eingeschlossen sein. Dann funktioniert alles. Der Header ios enthält beispielsweise stringbuf, das Folgendes enthält …

Obwohl Sie die Zeichenfolge nicht explizit eingeschlossen haben, wurde sie aufgrund eines anderen von Ihnen eingeschlossenen Standardheaders eingeschlossen. Beispielsweise kann der Vektor eine Zeichenfolge enthalten haben. Wenn Sie einen Vektor einschließen, wird alles aus dem Vektor in Ihre Datei aufgenommen.

Ich denke, zukünftige Versionen von Cpp sollten ein include_module- oder module-Schlüsselwort haben; die nur ein bestimmtes Modul aus einer Datei enthalten. Wenn eine Datei also 3 Klassen hat, schließen wir nur die ein, die wir brauchen.

zum Beispiel
-I “../mingw/lib/include”

 module <string>

Durchsucht das Verzeichnis nach Dateien, die die Zeichenfolgenklasse definieren. Die Kompilierung wäre deutlich langsamer.

Warum wird durch das Weglassen von „include Verursacht nur
Mehdi Mostafavi

Wie Branko sagte:

Es ist möglich, dass andere Header, die Sie einschließen, #include enthalten.

Werfen wir einen Blick auf iostream beinhaltet:

#include <bits/c++config.h>
#include <ostream>
#include <istream>

wenn Sie überprüfen istream Sie können einige sehen include
also so haben wir:

iostream => istream => ios => iosfwd

und in iosfwd Wir haben eine String-Bibliothek! aber es ist kein Standard, es ist für die Vorwärtsdeklaration. in iosfwd wir haben:

#include // Für String-Forward-Deklarationen.

und in stringfwd.h:

@file bits/stringfwd.h
This is an internal header file, included by other library headers.
Do not attempt to use it directly. @headername{string}

also, Sie können verwenden string ohne #include <string>.

986250cookie-checkWarum wird durch das Weglassen von „#include ” Verursacht nur manchmal Kompilierungsfehler?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy