Prüft, ob #include bereits deklariert ist

8

Ich versuche zu überprüfen, ob ein #include <file.h> bereits mit C ++ - Makro deklariert wurde.

Beispiel

In file.h mache ich:

%Vor%

In einer zweiten Datei namens second.h möchte ich prüfen, ob file.h bereits enthalten ist.

Typischer Pseudo-Code:

%Vor%

Ich habe ein paar #ifndef Direktiven versucht, aber keine Freude. Weiß jemand, wie man das erreicht?

    
Bitmap 07.08.2011, 15:37
quelle

5 Antworten

9

Alle anderen haben die korrekte Aufnahme von Include-Guard-Makros behandelt.

Datei.h

%Vor%

Aber alle anderen haben den zweiten Teil Ihrer Frage zur korrekten Verwendung verpasst:

Dies ist ein Beispiel für eine schlechte Verwendung:

%Vor%

Dies ist nicht korrekt (obwohl die Korrektheit möglicherweise zu stark ist).

Die in jeder Datei enthaltenen Wächter sollten ihren gesamten Inhalt umfassen. In der zweiten Datei sollte sich also #include "file.h" innerhalb der include guards befinden.

Außerdem müssen Sie nicht auf Inklusion testen, die in der Datei selbst vorgenommen wird. Daher sollte die Datei so aussehen:

%Vor%

Auch Ihre Makro-Wachen sind viel zu klein. Es besteht eine hohe Wahrscheinlichkeit, dass diese von jemand anderem verwendet werden; Das wird alle Arten von seltsamen Kollisionen verursachen.

Eine gute Möglichkeit, die Wächter einzigartig zu machen, ist die Verwendung eines Präfixes, Ihres vollständigen Namens (oder Spitznamens), oder wenn Sie Ihre eigene registrierte Webseite haben, dann verwendet sie ihren Domainnamen. Ich füge dann auch einen Teil der Verzeichnishierarchie hinzu, die die Datei enthält.

%Vor%

Eine andere Alternative (besonders wenn Sie unter Windows arbeiten) ist das Erzeugen einer GUID. Erzeugen Sie für jede Datei einfach eine neue Datei.

Endgültiger Punkt: nur andere Dateien aus Header-Dateien einschließen, wenn deren Inhalt absolut notwendig ist. Sie müssen nur "file.h" einschließen, wenn diese Datei eine Typdefinition hat, von der die Klasse abhängig ist. Wenn Ihre Klasse nur diese Klasse als Zeiger oder Verweis verwendet, verwenden Sie lieber die Vorwärtsdeklaration als die Header-Datei.

Die Szenarien, in denen Sie #include haben müssen, sind:

  • Sekunde ist ein Kind von zuerst.
  • Sekunde hat Mitglieder, die zuerst objects sind
  • second hat Methoden, die zuerst objects als Parameter
  • annehmen
  • Second hat Methoden, die als Ergebnis zuerst objects zurückgeben

Beachten Sie, dass ich den Begriff "Objekte" verwende. Wenn es sich um Referenzen oder Zeiger handelt, zählt dies nicht. In diesen Fällen können Sie die Forward-Deklaration verwenden, um das Problem zu lösen.

    
Martin York 07.08.2011, 17:33
quelle
7

in Datei.h:

%Vor%

Überprüfen Sie dann, ob file.h mit enthalten ist:

%Vor%     
nobody 07.08.2011 15:39
quelle
2

In Datei.h

%Vor%

Dies führt jedoch dazu, dass das Programm nicht kompiliert wird, wenn Sie file.h mehr als einmal einschließen. Was Sie wahrscheinlich wollen, ist

%Vor%

Dies verhindert Kompilierungsfehler / Warnungen aufgrund mehrfacher Einbindung.

    
Praetorian 07.08.2011 15:40
quelle
2

Der einfache Grund für die %Code% Zeile in der Kopfzeile soll es so machen, dass die Datei bei zweiten und weiteren Einschlüssen ein No-Op ist. Diese # Zeilen werden zusammen als "include guard" bezeichnet.

Also einfach #ifndef FILE_H wird bereits tun, was Sie in der zweiten Datei zu tun versuchen. (Der Präprozessor wird die Datei wahrscheinlich öffnen und lesen, bevor sie ihren Inhalt verwerfen, aber es ist anzunehmen, dass sie sich im Cache befindet, und daher ist im allgemeinen Fall keine Verbesserung der Compilerleistung zu erwarten.

Wenn Sie sich beschweren, dass eine Datei nicht enthalten ist, können Sie sie einfach selbst hinzufügen. Vielleicht möchten Sie verhindern, dass eine Datei eingeschlossen wird, wenn eine andere Datei enthalten ist, also entweder - oder; oder strikte Reihenfolge der Includes (wahrscheinlich ein Symptom eines Designproblems). Oder verwenden Sie alternativen Code, wenn etwas (nicht) enthalten ist.

In solchen Fällen funktioniert #include "file.h" oder #ifdef X , wobei X mit dem übereinstimmt, was im include guard verwendet wird.

    
MaHuJa 07.08.2011 16:11
quelle
1

Der typische Weg, um so etwas zu tun, ist:

%Vor%

Dies verhindert, dass die gleiche Kopfzeile mehrfach eingefügt wird.

    
Robert S. Barnes 07.08.2011 15:39
quelle

Tags und Links