3 Stimmen

Entscheiden, welche Standard-Header-Dateien #include werden sollen

Angenommen, ich bearbeite eine große C++-Quelldatei und füge ein paar Codezeilen hinzu, die zufällig auto_ptr , wie im folgenden Beispiel.

#include <string>

// ... (much code here)

void do_stuff()
{
    std::string str("hello world");
    // ... (much code here too)
    std::auto_ptr<int> dummy; // MY NEW CODE
    // ...
}

Dieses Beispiel lässt sich mit gcc 3.4.4 (cygwin) kompilieren, da der Standard-Header <string> enthält zufällig die Überschrift <memory> erforderlich für die Erstellung von auto_ptr . Allerdings funktioniert dies nicht auf gcc 4.5.0 (mingw); sie scheinen ihre Header-Dateien oder etwas aufgeräumt haben.

Wenn ich also Code hinzufüge, der auto_ptr sollte ich sofort nachsehen, ob die Datei Folgendes enthält #include <memory> am Anfang, als diese Antwort impliziert? Ich mache das nie (ich finde es zu lästig); ich verlasse mich immer darauf, dass der Compiler prüft, ob eine #include fehlt.

Gibt es eine Option, die die Programmierung nicht beeinträchtigt und die Übertragbarkeit meines Codes gewährleistet?

Gibt es eine C++-Standardbibliothek-Implementierung, deren Header sich nicht mehr als nötig gegenseitig einschließen?

11voto

dappawit Punkte 11642

Wenn Sie etwas aus der Standardbibliothek verwenden, sollten Sie den Header einbinden, in dem es definiert ist. Das ist die einzige portable Option. Auf diese Weise vermeiden Sie den von Ihnen zitierten Fall, dass ein Header zufällig in einer Version oder einem Compiler einen anderen einschließt, in einer anderen aber nicht. auto_ptr ist definiert in <memory> Wenn Sie es also verwenden, fügen Sie diese Kopfzeile ein.

[Bearbeiten...]

Als Antwort auf Ihren Kommentar... Fragen Sie, ob der Compiler helfen kann, zu erkennen, wenn Sie etwas aus einem Standard-Header verwenden, das Sie nicht direkt eingebunden haben? Das wäre hilfreich, aber ich denke, es ist ein bisschen zu viel verlangt. Dazu müsste der Compiler wissen, welche Standardbibliotheksheader welche Standardbibliotheksdefinitionen enthalten, und dann prüfen, ob Sie die richtigen Header für die verwendeten Definitionen eingebunden haben.

Genaue Bestimmung wie eine Kopfzeile enthalten war, ist ebenfalls eine große Aufgabe. Wenn Sie eine Standardbibliotheksdefinition verwenden, dann müssen Sie den Header irgendwie einbinden. Der Compiler müsste feststellen, ob Sie den Header selbst eingebunden haben (möglicherweise durch eigene Header oder eine Bibliothek eines Drittanbieters) oder ob er durch einen anderen Standardbibliotheksheader kam. (In Ihrem Beispiel müsste er zum Beispiel in der Lage sein, den Unterschied zu erkennen zwischen <memory> Einbindung über <string> oder in Ihrem eigenen Code enthalten sind).

Es müsste mit verschiedenen Versionen der Standardbibliothek (z.B. C++03 vs. C++0x) und verschiedenen Anbietern umgehen. Und was ist, wenn diese Anbieter einer Drittanbieter-Stdlib sich nicht genau an den Standard halten, dann könnten Sie schlechte Warnungen darüber erhalten, welche Header einzubinden sind.

Ich sage das nur, um zu erklären (mit meinem begrenzten Compiler/Stdlib-Wissen), warum ich nicht glaube, dass Compiler diese Funktion haben. Ich stimme zu, es wäre hilfreich, aber ich denke, die Kosten überwiegen den Nutzen.

0voto

Arackna Punkte 2425

Am besten ist es, die korrekte Kopfzeile einzubinden, in der das Konstrukt definiert ist. und Include-Dateien sollten durch die Verwendung von Makros, die die Dateien "bewachen", vor Mehrfacheinschlüssen geschützt werden

-1voto

J T Punkte 4686

Im Allgemeinen sind Header-Dateien von "Include-Guards" umgeben. Die Schutzmaßnahmen werden durch gebildet:

MyHeader.h:

#ifndef __MY_HEADER_H__
#    define __MY_HEADER_H__

     //body of MyHeader.h

#endif

Sie können MyHeader.h also so oft einbinden, wie Sie wollen:

#include "MyHeader.h"
#include "MyHeader.h"
#include "MyHeader.h"
#include "MyHeader.h"

Und es wird keine Probleme für den Compiler verursachen (es wird immer nur einmal eingebunden). Außerdem könnten Sie eine weitere Datei einbinden, die "MyHeader.h" enthält, und es würde die gleiche Regel gelten.

Das heißt, wenn Sie etwas verwenden wollen, das in einer Kopfzeile definiert ist, fügen Sie es ein! (Selbst wenn Sie denken, dass etwas anderes es enthalten könnte, gibt es keinen Grund, nicht sicher zu sein).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X